PHPackages                             karnoweb/laravel-module-manager - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. karnoweb/laravel-module-manager

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

karnoweb/laravel-module-manager
===============================

A powerful module management system for Laravel with dependency resolution, tree structure, and Laravel 12 support

v1.0.5(4mo ago)047↓92.9%MITPHPPHP ^8.2

Since Feb 9Pushed 4mo agoCompare

[ Source](https://github.com/karnoweb/laravel-module-manager)[ Packagist](https://packagist.org/packages/karnoweb/laravel-module-manager)[ RSS](/packages/karnoweb-laravel-module-manager/feed)WikiDiscussions main Synced 2d ago

READMEChangelogDependencies (4)Versions (7)Used By (0)

Laravel Module Manager
======================

[](#laravel-module-manager)

A module/feature-flag system for Laravel with dependency resolution, tree structure, system (locked) modules, and Laravel 10–12 support.

For usage scenarios and examples in Persian (فارسی), see [سناریوهای کاربردی](docs/fa/usage-scenarios.md).

Requirements
------------

[](#requirements)

- PHP 8.2+
- Laravel 10.x, 11.x or 12.x

Installation
------------

[](#installation)

```
composer require karnoweb/laravel-module-manager
```

Publish config and migrations:

```
php artisan vendor:publish --tag=module-manager-config
php artisan vendor:publish --tag=module-manager-migrations
php artisan migrate
```

Configuration
-------------

[](#configuration)

Edit `config/module-manager.php`:

KeyDescription`table_prefix`Optional prefix for tables (e.g. `mm_` → `mm_modules`)`tables.modules`Modules table name`tables.dependencies`Dependencies table name`migration_prefix`Prefix for published migration filenames`cache.enabled`Enable cache for active status`cache.ttl`Cache TTL (seconds)`cache.prefix`Cache key prefix`default_deactivation``cascade`, `restrict`, or `none``events.enabled`Fire module events`modules`Array of module definitions (see below)### Defining modules in config

[](#defining-modules-in-config)

Add modules under `modules` so they can be synced with `php artisan module:sync`. You can use a **nested** structure with `records`: children inherit `group` and get `parent` set automatically.

**Nested (recommended):**

```
'modules' => [
    'products' => [
        'name' => 'Products',
        'description' => 'Product management',
        'group' => 'shop',
        'icon' => 'fa-box',
        'sort_order' => 0,
        'is_active' => false,
        'on_deactivate' => 'cascade',
        'requires' => [],
        'records' => [
            'simple_product' => [
                'name' => 'Simple Product',
                'is_active' => true,
                'requires' => ['products'],
            ],
            'variable_product' => [
                'name' => 'Variable Product',
                'requires' => ['products'],
            ],
        ],
    ],
],
```

**Flat:** same keys at top level; set `group` and `parent` on each module.

Sync from config:

```
php artisan module:sync
```

---

API Reference
-------------

[](#api-reference)

### Status checks

[](#status-checks)

MethodDescription`Module::active(string|array $keys)`Returns `true` if module(s) are active`Module::inactive(string $key)`Returns `true` if module is inactive`Module::allActive(array $keys)`All given keys must be active`Module::someActive(array $keys)`At least one key active### Conditional execution

[](#conditional-execution)

MethodDescription`Module::when(string $key, Closure $active, ?Closure $inactive = null)`Run callback by status`Module::unless(string $key, Closure $callback)`Run callback when inactive### Activation / deactivation

[](#activation--deactivation)

MethodDescription`Module::activate(string $key)`Activate module (throws on missing deps / conflicts)`Module::deactivate(string $key)`Deactivate (throws for system modules or active dependents)`Module::toggle(string $key)`Toggle active state; returns new state### Validation

[](#validation)

MethodDescription`Module::canActivate(string $key)`Whether activation is allowed`Module::canDeactivate(string $key)`Whether deactivation is allowed`Module::whyCantActivate(string $key)`Reasons (e.g. `missing_dependencies`, `conflicts`)`Module::whyCantDeactivate(string $key)`Reasons (e.g. `system_module`, `active_dependents`)### Dependencies

[](#dependencies)

MethodDescription`Module::requires(string $module, string $dependency)`Add required dependency`Module::conflicts(string $module, string $conflictsWith)`Add conflict (bidirectional)`Module::suggests(string $module, string $suggestion)`Add suggestion`Module::getDependencies(string $key)`Get required modules`Module::getDependents(string $key)`Get modules that require this one### Tree

[](#tree)

MethodDescription`Module::tree(?string $group = null)`Nested tree (with `children`)`Module::children(string $key)`Direct children`Module::descendants(string $key)`All descendants`Module::ancestors(string $key)`All ancestors`Module::siblings(string $key)`Siblings### Metadata

[](#metadata)

MethodDescription`Module::meta(string $key, string $metaKey, mixed $default = null)`Get metadata value`Module::setMeta(string $key, string|array $metaKey, mixed $value = null)`Set metadata### Management

[](#management)

MethodDescription`Module::define(string $key, string $name, array $options = [])`Create or update module`Module::all()`All modules (ordered)`Module::groups()`List of groups`Module::group(string $group)`Modules in group`Module::find(string $key)`Find by key or null`Module::findOrFail(string $key)`Find or throw`Module::flushCache()`Clear active-status cache### Helpers

[](#helpers)

FunctionDescription`module(?string $key = null)`Manager instance or `active($key)``module_active(string|array $keys)`Same as `Module::active()``module_inactive(string $key)`Same as `Module::inactive()``module_meta(string $key, string $metaKey, mixed $default = null)`Same as `Module::meta()``when_module(string $key, Closure $active, ?Closure $inactive = null)`Same as `Module::when()`---

Artisan commands
----------------

[](#artisan-commands)

CommandDescription`php artisan module:list`List modules (`--group=`, `--active`, `--inactive`)`php artisan module:activate {key}`Activate a module`php artisan module:deactivate {key}`Deactivate a module`php artisan module:tree`Show tree (`--group=`, `--json`)`php artisan module:sync`Sync modules from config (`--force` to skip confirm)---

Usage examples
--------------

[](#usage-examples)

### Check and run code by module

[](#check-and-run-code-by-module)

```
use Karnoweb\LaravelModuleManager\Facades\Module;

if (Module::active('reports')) {
    return view('reports.dashboard');
}

Module::when('advanced_discount', function () {
    return redirect()->route('discounts.advanced');
}, function () {
    return redirect()->route('discounts.simple');
});
```

### Blade

[](#blade)

```
@module('reports')
    Reports
@endmodule

@moduleany(['simple_product', 'coding_product'])
    Products
@endmoduleany

@modules(['products', 'discounts'])
    Shop modules are active.
@endmodules
```

### Routes and middleware

[](#routes-and-middleware)

```
Route::middleware(['module:reports'])->group(function () {
    Route::get('/reports', [ReportController::class, 'index']);
});

Route::middleware(['module:products,discounts'])->get('/shop', ...);
```

### Define modules and dependencies in code

[](#define-modules-and-dependencies-in-code)

```
use Karnoweb\LaravelModuleManager\Facades\Module;

Module::define('products', 'Products', [
    'group' => 'shop',
    'icon' => 'fa-box',
    'is_active' => true,
]);

Module::define('simple_product', 'Simple Product', [
    'group' => 'shop',
    'parent' => 'products',
    'is_active' => true,
]);

Module::requires('simple_product', 'products');
Module::conflicts('legacy_cart', 'new_cart');
Module::suggests('reports', 'products');
```

### System (locked) modules

[](#system-locked-modules)

Set `is_system => true` in config or when defining. System modules cannot be deactivated via `Module::deactivate()` or `module:deactivate` (throws `SystemModuleException`).

```
Module::define('core', 'Core', ['is_system' => true]);
```

### Sync from config in app seeder

[](#sync-from-config-in-app-seeder)

```
namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Karnoweb\LaravelModuleManager\ModuleSeeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        (new ModuleSeeder)->run();
    }
}
```

---

Exceptions
----------

[](#exceptions)

ExceptionWhen`ModuleNotFoundException`Module key not found`DependencyException`Missing deps or active dependents block action`ConflictException`Conflicting module is active`CircularDependencyException`Circular requires detected`SystemModuleException`Deactivate attempted on system module---

License
-------

[](#license)

MIT.

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance75

Regular maintenance activity

Popularity9

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity51

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 ~2 days

Total

6

Last Release

135d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/a6a881e293406595d74617357c2477180a2a48cb6613acb3395652bd00147f78?d=identicon)[sajadsoft1](/maintainers/sajadsoft1)

---

Top Contributors

[![sajadsoft1](https://avatars.githubusercontent.com/u/10587549?v=4)](https://github.com/sajadsoft1 "sajadsoft1 (7 commits)")

---

Tags

laraveldependencymodulefeature flagModule Manager

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/karnoweb-laravel-module-manager/health.svg)

```
[![Health](https://phpackages.com/badges/karnoweb-laravel-module-manager/health.svg)](https://phpackages.com/packages/karnoweb-laravel-module-manager)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M346](/packages/psalm-plugin-laravel)[yajra/laravel-oci8

Oracle DB driver for Laravel via OCI8

8793.2M25](/packages/yajra-laravel-oci8)[api-platform/laravel

API Platform support for Laravel

58171.6k14](/packages/api-platform-laravel)[wearepixel/laravel-cart

A cart implementation for Laravel

1374.8k](/packages/wearepixel-laravel-cart)[zonneplan/laravel-module-loader

Module loader for Laravel

24124.8k](/packages/zonneplan-laravel-module-loader)

PHPackages © 2026

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