kadevland/laravel-easy-modules
Installation
composer require kadevland/laravel-easy-modules
php artisan easy-modules:install
modules/).First Module Creation
php artisan easy-modules:make Blog --type=clean
--type=clean generates a Clean Architecture template (alternatives: basic, resourceful).Verify Structure
modules/Blog/ for generated files:
Blog/
├── Domain/
├── Application/
├── Infrastructure/
├── Presentation/
├── config/
├── routes/
└── ...
Generate a module for a new feature (e.g., UserProfile):
php artisan easy-modules:make UserProfile --type=resourceful
UserProfileController)user_profiles table)web.php or api.php)resourceful type).Modular Feature Development
php artisan easy-modules:make Posts --type=clean
php artisan easy-modules:make-command Posts/GenerateSitemap
php artisan easy-modules:make-job Posts/ProcessPost
modules/Posts/Providers/ModuleServiceProvider.php to bind interfaces to implementations.Integration with Existing Code
// In a controller or service
$postService = app(\Modules\Posts\Domain\Services\PostService::class);
// In a route file
\Modules\Posts\Presentation\Http\Routes\web();
Database Migrations
php artisan migrate --path=modules/Posts/Database/Migrations
php artisan easy-modules:publish-migrations Posts
Testing
modules/Posts/Tests/Unit/.modules/Posts/Tests/Feature/.php artisan test --module=Posts
Override Default Templates
php artisan vendor:publish --tag=easy-modules-stubs
resources/views/vendor/easy-modules/stubs/.Module Dependencies
modules/Posts/composer.json:
"require": {
"kadevland/laravel-easy-modules": "^2.0"
},
"extra": {
"easy-modules": {
"depends": ["Auth"]
}
}
composer update in the module directory.Dynamic Module Loading
config/easy-modules.php:
'enabled_modules' => [
'Posts' => env('ENABLE_POSTS_MODULE', true),
'Blog' => env('ENABLE_BLOG_MODULE', false),
],
API/Resourceful Modules
php artisan easy-modules:make Posts/Api --type=resourceful --api
modules/Posts/Presentation/Http/Resources/.Namespace Collisions
User vs. Users) can cause autoloading conflicts.use Modules\Users\Domain\Entities\User as UserEntity;
use Modules\User\Domain\Entities\User as AdminUser;
Service Provider Registration
ModuleServiceProvider in config/app.php.php artisan easy-modules:register Posts
--all flag to register all modules:
php artisan easy-modules:register --all
Migration Paths
php artisan migrate.modules/Posts/Database/Migrations is in config/database.php under migrations:
'migrations' => [
database_path('migrations'),
modules_path('*/Database/Migrations'),
],
Route Caching
php artisan route:clear
config/easy-modules.php:
'cache_routes' => env('APP_ENV') !== 'local',
Composer Autoload
composer dump-autoload
--optimize for production:
composer dump-autoload --optimize
Module Not Found Errors
config/easy-modules.php under modules.Artisan Command Issues
-v for verbose output:
php artisan easy-modules:make Posts --type=clean -v
laravel/framework).vendor:publish step).Clean Architecture Quirks
Domain/ and implementations in Infrastructure/.Application/ depending directly on Infrastructure/. Use interfaces in Domain/ as contracts.Testing Modules
--module flag to run only relevant tests:
php artisan test --module=Posts --filter=UserProfileTest
partialMock for shared services:
$this->partialMock(\Modules\Auth\Domain\Services\AuthService::class, function ($mock) {
$mock->shouldReceive('checkPermission')->andReturn(true);
});
Custom Module Types
php artisan vendor:publish --tag=easy-modules-stubs
resources/views/vendor/easy-modules/stubs/module-types/custom/.config/easy-modules.php:
'module_types' => [
'custom' => [
'path' => 'custom',
'description' => 'Custom module template',
],
],
Post-Creation Hooks
php artisan vendor:publish --tag=easy-modules-events
ModulesCreated event in app/Listeners/.Dynamic Module Configuration
// In a service provider
$config = require module_path('Posts/config/posts.php');
php artisan easy-modules:publish-config Posts
Module Isolation
'enabled' => false in config/easy-modules.php.php artisan easy-modules:uninstall Posts --force
Lazy-Loading Modules
eager_load_modules in config/easy-modules.php to defer loading:
'eager_load_modules' => false,
Optimize Autoloading
composer.json:
"autoload-dev": {
"psr-4": {
"Modules\\": "modules/"
},
"exclude-from-classmap": [
"modules/*/Tests/"
]
}
Route Optimization
How can I help you explore Laravel packages today?