lazerg/laravel-modular

There is no license information available for the latest version (v0.13) of this package.

Laravel Modular

v0.13 2024-07-05 01:47 UTC

This package is auto-updated.

Last update: 2025-08-01 11:05:46 UTC


README

cover

Version Downloads count Repository count Last commit Stars count

Laravel Modular helps you split a Laravel application into smaller independent modules. Each module contains its own controllers, models, views and routes. This keeps features isolated, simplifies maintenance and allows modules to be reused in other projects.

Installation

composer require lazerg/laravel-modular

Creating a module

  1. Create a directory for the module, e.g. modules/User/app.
  2. Register it in composer.json so that classes are autoloaded:
{
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/",
            "Modules\\User\\": "modules/User/app/",
            "Modules\\User\\Database\\Factories\\": "modules/User/database/factories/",
            "Modules\\User\\Database\\Seeders\\": "modules/User/database/seeders/"
        }
    }
}

Run composer dump-autoload after updating the file.

Next create UserServiceProvider inside modules/User/app and extend ModuleServiceProvider. Finally register this provider in bootstrap/providers.php.

Moving existing files

Move the default Laravel files into your new module:

  1. /app/Models/User -> /modules/User/app/Models/User
  2. Update auth.providers.users.model in config/auth.php to Modules\\User\\Models\\User.
  3. /database/migrations/2014_10_12_000000_create_users_table.php -> /modules/User/database/migrations/2014_10_12_000000_create_users_table.php
  4. /database/factories/UserFactory.php -> /modules/User/database/factories/UserFactory.php

Seeder setup

  1. Make database/seeders/DatabaseSeeder.php extend ModularDatabaseSeeder (do not override run).
  2. Create DatabaseSeeder in modules/User/database/seeders extending BaseDatabaseSeeder.
  3. Add your seeders like UserSeeder in the same folder and register them in the module seeder's $earlySeeders or $seeders array.

Module loaders

ModuleServiceProvider automatically loads different resources from a module:

Path Register & Usage
modules/{module}/app/Commands add command classes via the $commands property
modules/{module}/app/Events register events using the $events property
modules/{module}/app/Observers add model observers using the $observers property
modules/{module}/app/Policies register policies using the $policies property
modules/{module}/config configuration files are loaded automatically, access them with config('User::settings.key')
modules/{module}/database/migrations migration files in this folder are loaded
modules/{module}/routes web.php, api.php and console.php are automatically registered
modules/{module}/lang translation files available via trans('User::file.key')
modules/{module}/views view files available via view('User::file')
modules/{module}/database/seeders/DatabaseSeeder extend BaseDatabaseSeeder and register other seeders in $earlySeeders or $seeders

Routing

web.php

Route::get('/index', [UserController::class, 'index'])->name('index');
Option Default Notes
name users.index set $disableRoutePluralization = true in UserServiceProvider to use user.index
namespace Modules\\User\\Http\\Controllers
middleware [ 'web', 'auth' ] set $mustBeAuthenticated = false to remove auth; use $mustBeGuest = true for guest-only routes
url /users/index set $disableRoutePluralization = true for /user/index; set $disableWebRoutePrefix = true for /index

api.php

Route::get('/index', [UserController::class, 'index'])->name('index');
Option Default Notes
name api.users.index set $disableRoutePluralization = true for api.user.index
namespace Modules\\User\\Http\\Api\\Controllers
middleware [ 'api', 'auth' ] set $mustBeAuthenticated = false to remove auth; use $mustBeGuest = true for guest-only routes
url /api/users/index set $disableRoutePluralization = true for /api/user/index