PHPackages                             merakilab/meraki-core - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. merakilab/meraki-core

ActiveLibrary[Framework](/categories/framework)

merakilab/meraki-core
=====================

Meraki Core

v1.0.4(6mo ago)014MITPHPPHP ^8.2

Since Dec 27Pushed 5mo agoCompare

[ Source](https://github.com/meraki-labs/meraki-core)[ Packagist](https://packagist.org/packages/merakilab/meraki-core)[ RSS](/packages/merakilab-meraki-core/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (1)Versions (11)Used By (0)

Meraki Core
===========

[](#meraki-core)

`merakilab/meraki-core` is the **foundation package** of the Meraki ecosystem. It provides shared conventions, registries, events, and lifecycle hooks that allow independent modules and packages to integrate cleanly — without tight coupling.

Meraki Core **does not implement business logic** such as roles, authorization engines, or permission storage. It only *listens, aggregates, and exposes metadata*.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

[](#meraki-core-does-not-implement-business-logic-such-as-roles-authorization-engines-or-permission-storage-it-only-listens-aggregates-and-exposes-metadata)

Design Principles
-----------------

[](#design-principles)

- **Core is neutral**: no policy, no storage, no UI
- **Modules declare, Core aggregates**
- **IAM decides**: authorization logic lives in dedicated packages
- **Event-driven &amp; extensible**
- **Convention over enforcement**

---

Package Information
-------------------

[](#package-information)

- **Composer name**: `merakilab/meraki-core`
- **Namespace**: `Meraki\\Core`
- **Framework**: Laravel / Illuminate components

---

Core Responsibilities
---------------------

[](#core-responsibilities)

Meraki Core is responsible for:

- Registering and bootstrapping the Meraki lifecycle
- Auto-loading Meraki modules/packages
- Managing shared configuration conventions
- Collecting permission metadata from modules
- Exposing registries, helpers, and events for other packages

Meraki Core is **NOT** responsible for:

- Authorization decisions
- Role management
- Permission persistence
- Route protection
- UI or admin panels

---

CoreServiceProvider
-------------------

[](#coreserviceprovider)

`CoreServiceProvider` is the main entry point.

Responsibilities:

- Register core services and registries
- Boot lifecycle events
- Merge and publish shared configuration safely
- Discover enabled modules
- Trigger permission collection

```
use Meraki\Core\CoreServiceProvider;
```

---

Permission System (Metadata Only)
---------------------------------

[](#permission-system-metadata-only)

### Key Concept

[](#key-concept)

Permissions in Meraki Core are **declarative metadata**, not access rules.

- Each module declares its own permissions
- Core collects all declared permissions
- IAM or other packages decide how to use them

---

### Declaring Permissions in a Module

[](#declaring-permissions-in-a-module)

Each module can declare permissions via its config file, for example:

```
// config/meraki-blog.php
return [
    'permissions' => [
        'blog.view',
        'blog.create',
        'blog.update',
        'blog.delete',
    ],
];
```

---

### PermissionRegistry

[](#permissionregistry)

The `PermissionRegistry` lives in Core and acts as a **central collector**.

Responsibilities:

- Register permissions from all enabled modules
- Store permission metadata in memory
- Expose permissions to other packages

Core does **not**:

- Validate permissions
- Resolve conflicts or overlaps
- Decide access rules

---

### Accessing Permissions

[](#accessing-permissions)

Use the global helper:

```
get_permissions();
```

Returns a normalized list of all permissions declared by modules.

---

Events &amp; Lifecycle Hooks
----------------------------

[](#events--lifecycle-hooks)

Meraki Core exposes events so that other packages (e.g. IAM) can hook into the lifecycle.

Examples:

- Module booted
- Permissions registered
- Core fully booted

This allows packages to:

- Sync permissions to database
- Build role mappings
- Attach authorization engines

Without Core knowing *how* they do it.

---

Capability Gate
---------------

[](#capability-gate)

Meraki Core acts as a **capability gate** — a single access point that routes calls to whichever driver is available, with automatic fallback to Laravel defaults when no Meraki package is installed.

### Supported capabilities

[](#supported-capabilities)

CapabilityContractDefault (fallback)`auth``Meraki\Core\Contracts\AuthDriver``LaravelAuthAdapter` (wraps `Auth` facade)`permission``Meraki\Core\Contracts\PermissionDriver``LaravelGateAdapter` (wraps `Gate` facade)### Usage

[](#usage)

```
// Via Facade
Meraki::auth()->check();          // bool
Meraki::auth()->id();             // mixed
Meraki::auth()->user();           // ?object
Meraki::can('posts.create');      // bool
Meraki::can('posts.edit', $user); // bool — check for a specific user

// Via helpers
meraki()->auth()->check();
meraki_can('posts.create');
```

### Driver resolution order

[](#driver-resolution-order)

For each capability, CoreManager resolves the driver as follows:

1. `config('meraki.capabilities..driver')` — explicit name (not `auto`)
2. Last driver registered via `extend()` (package driver)
3. Laravel adapter (built-in fallback)

### Registering a package driver (convention for Meraki packages)

[](#registering-a-package-driver-convention-for-meraki-packages)

In your package's `ServiceProvider::register()`:

```
use Meraki\Core\CoreManager;

public function register(): void
{
    $core = $this->app->make(CoreManager::class);

    // Register the package so Core knows it's installed
    $core->packages()->register('meraki-auth', [
        'provider' => static::class,
        'config'   => 'meraki-auth',   // key used to load permissions from config
    ]);

    // Register the capability driver
    $core->extend('auth', 'meraki-auth', fn ($app) => new MerakiAuthDriver(
        $app->make(\Meraki\Auth\Services\AuthManager::class)
    ));
}
```

`MerakiAuthDriver` is a thin adapter **inside your package** that implements `Meraki\Core\Contracts\AuthDriver`.

### Registering a third-party driver (e.g. spatie/laravel-permission)

[](#registering-a-third-party-driver-eg-spatielaravel-permission)

```
// In AppServiceProvider::register()
$this->app->make(\Meraki\Core\CoreManager::class)
    ->extend('permission', 'spatie', fn ($app) => new SpatiePermissionDriver());
```

Then in `config/meraki.php`:

```
'capabilities' => [
    'permission' => ['driver' => 'spatie'],
],
```

Or set `MERAKI_PERMISSION_DRIVER=spatie` in `.env`.

---

Authorization &amp; IAM Integration
-----------------------------------

[](#authorization--iam-integration)

Meraki Core defines **conventions**, not implementations.

- Core expects IAM packages to expose methods like `can()`
- Laravel's `Gate::can()` **can be used**, but is optional
- IAM packages may wrap, replace, or ignore Laravel Gate

Core treats this as a **documented convention**, not a hard dependency.

---

Enable / Disable Modules
------------------------

[](#enable--disable-modules)

Modules can be enabled or disabled via configuration.

Core only:

- Detects enabled modules
- Loads their configs
- Registers their permissions

Behavior differences are handled by consuming packages.

---

Relationship with Other Packages
--------------------------------

[](#relationship-with-other-packages)

### meraki-iam (example)

[](#meraki-iam-example)

Typical responsibilities:

- Persist permissions
- Manage roles and scopes
- Resolve permission conflicts
- Implement `can()` / authorization logic
- Integrate with routes and middleware

### Other Feature Packages

[](#other-feature-packages)

- Declare permissions
- Listen to Core events
- Remain independent of IAM implementation

---

Debugging
---------

[](#debugging)

Use the `meraki:info` Artisan command to inspect the current state of the Capability Gate — useful when a driver isn't resolving as expected:

```
php artisan meraki:info
```

Sample output:

```
  Meraki Core — Driver State
  ────────────────────────────────────────
  Capability  Driver              Class
  auth        auto → laravel      Meraki\Core\Adapters\LaravelAuthAdapter
  permission  auto → laravel      Meraki\Core\Adapters\LaravelGateAdapter

  Registered Packages (PackageRegistry)
  ────────────────────────────────────────
  (none)

  Permission Registry: 0 permissions loaded

```

When a package like `meraki-auth` is installed, its driver and permissions will appear in the output.

---

Testing
-------

[](#testing)

### `InteractsWithMerakiCore` Trait

[](#interactswithmerakicore-trait)

Packages that integrate with Meraki Core can use this trait in their test classes to reduce boilerplate:

```
use Meraki\Core\Testing\InteractsWithMerakiCore;
use Orchestra\Testbench\TestCase;

class MyPackageTest extends TestCase
{
    use InteractsWithMerakiCore;

    public function test_my_driver_works(): void
    {
        $fakeDriver = new class implements \Meraki\Core\Contracts\PermissionDriver {
            public function can(string $permission, mixed $user = null): bool
            {
                return $permission === 'do.something';
            }
        };

        $this->registerFakeDriver('permission', 'fake', $fakeDriver);

        $this->assertMerakiCan('do.something');
        $this->assertMerakiCannot('do.something.else');
    }
}
```

**Available helpers:**

MethodDescription`registerFakeDriver(string $capability, string $name, object $driver)`Register a fake driver and set it as the active driver for the capability`assertMerakiCan(string $permission, mixed $user = null)`Assert that `CoreManager::can()` returns `true``assertMerakiCannot(string $permission, mixed $user = null)`Assert that `CoreManager::can()` returns `false`> **Note:** The `src/Testing/` directory is intended for use in tests only. It is mapped under `autoload-dev` and should not be relied upon in production code.

---

Summary
-------

[](#summary)

Meraki Core is the **contract layer** of the Meraki ecosystem.

It:

- Connects packages
- Aggregates metadata
- Emits lifecycle events
- Stays out of business logic

This keeps the system:

- Modular
- Replaceable
- Testable
- Long-term maintainable

---

License
-------

[](#license)

MIT

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance71

Regular maintenance activity

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

6

Last Release

183d ago

Major Versions

v0.0.3 → v1.0.02026-01-02

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/5545183?v=4)[MerakiLabs](/maintainers/MerakiLabs)[@merakilabs](https://github.com/merakilabs)

---

Top Contributors

[![DouDangt](https://avatars.githubusercontent.com/u/5416883?v=4)](https://github.com/DouDangt "DouDangt (14 commits)")

### Embed Badge

![Health badge](/badges/merakilab-meraki-core/health.svg)

```
[![Health](https://phpackages.com/badges/merakilab-meraki-core/health.svg)](https://phpackages.com/packages/merakilab-meraki-core)
```

###  Alternatives

[laravel/octane

Supercharge your Laravel application's performance.

4.0k26.6M223](/packages/laravel-octane)[unopim/unopim

UnoPim Laravel PIM

10.5k2.4k](/packages/unopim-unopim)[code16/sharp

Laravel Content Management Framework

79164.7k8](/packages/code16-sharp)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21318.6k3](/packages/ecotone-laravel)[codewithdennis/larament

Larament is a time-saving starter kit to quickly launch Laravel 13.x projects. It includes FilamentPHP 5.x pre-installed and configured, along with additional tools and features to streamline your development workflow.

3991.8k](/packages/codewithdennis-larament)[r2luna/brain

Brain: A process-driven architecture alternative for your Laravel Application.

6338.7k1](/packages/r2luna-brain)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
