uncover / modular-monolith-laravel
Modular monolith architecture scaffolding for Laravel
Package info
github.com/uncoverthefuture-org/modular-monlith-laravel
pkg:composer/uncover/modular-monolith-laravel
Requires
- php: ^8.0
- illuminate/console: ^9.0|^10.0|^11.0
- illuminate/database: ^9.0|^10.0|^11.0
- illuminate/http: ^9.0|^10.0|^11.0
- illuminate/support: ^9.0|^10.0|^11.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^10.0
- dev-main
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-release-please--branches--main
- dev-fix/docs-types
- dev-feature/uncover-docs-shell
- dev-feature/vitepress-docs
- dev-fix/pages-permissions
- dev-fix/enable-github-pages
- dev-feature/github-pages-docs
- dev-fix/packagist-bearer-auth
- dev-fix/packagist-curl-env-vars
- dev-fix/packagist-infisical-workflow
- dev-fix/packagist-workflow-v2
- dev-fix/packagist-workflow-and-github-files
- dev-fix/release-please-and-ci
- dev-sirdavis/fix-test-suite-and-composer
This package is auto-updated.
Last update: 2026-04-27 03:51:13 UTC
README
A Laravel package that provides scaffolding for building modular monolith applications with standardized CRUD patterns, UUID support, and automatic route registration.
Features
- One Command Module Generation: Generate Controller, Model, Validation, Middleware, Service, and Observer with a single artisan command
- Base Classes with Full CRUD: Pre-built base classes with complete CRUD operations (create, read, update, delete, query)
- Route Macro:
Route::moduleResource()for automatic REST endpoint registration - UUID Support: Automatic UUID generation and handling
- Batch Operations: Built-in support for batch create and delete
- Flexible Validation: Per-action validation rules (create, read, update, delete, query)
- Service Layer: Base service with caching, transaction support, and query methods
- Observers: Base observer for model lifecycle events
- Publishable Base Classes: Customize base classes if needed
Requirements
- PHP 8.0+
- Laravel 9.0, 10.0, or 11.0
Installation
composer require uncover/modular-monolith-laravel
The package will auto-register its service provider.
Quick Start
1. Generate a Module
# Generate controller and model (default) php artisan modular:make EmailVerification # Generate all components php artisan modular:make EmailVerification --all # Generate with specific components php artisan modular:make EmailVerification --validation --middleware --service --observer --migration
This creates:
app/Http/Controllers/EmailVerificationController.php- ExtendsModularControllerapp/Models/EmailVerification.php- ExtendsModularModelapp/Validations/EmailVerificationValidation.php- ExtendsModularValidationapp/Http/Middleware/EmailVerificationMiddleware.php- ExtendsModularMiddlewareapp/Services/EmailVerificationService.php- ExtendsModularServiceapp/Observers/EmailVerificationObserver.php- ExtendsModularObserverdatabase/migrations/xxxx_xx_xx_create_email_verifications_table.php(with --migration)
2. Add Routes
In your routes/api.php:
use App\Http\Controllers\EmailVerificationController; // Basic usage Route::moduleResource('email-verifications', EmailVerificationController::class); // With middleware Route::moduleResource('email-verifications', EmailVerificationController::class, [ 'middleware' => ['auth:sanctum', 'EmailVerificationMiddleware'] ]);
The moduleResource macro automatically creates:
POST /email-verifications→createGET /email-verifications→queryGET /email-verifications/{id}→readPATCH /email-verifications/{id}→updateDELETE /email-verifications/{id?}→delete
Command Options
| Option | Description |
|---|---|
--controller |
Generate a controller (default: true) |
--model |
Generate a model (default: true) |
--validation |
Generate a validation class |
--middleware |
Generate a middleware class |
--service |
Generate a service class |
--observer |
Generate an observer class |
--migration |
Create a migration file |
--all |
Generate all components |
--force |
Overwrite existing files |
Configuration
Publish the config file:
php artisan vendor:publish --tag=modular-config
Available Options
// config/modular.php // Customize paths 'paths' => [ 'controller' => app_path('Http/Controllers'), 'model' => app_path('Models'), 'validation' => app_path('Validations'), 'middleware' => app_path('Http/Middleware'), 'service' => app_path('Services'), 'observer' => app_path('Observers'), 'migration' => database_path('migrations'), ], // Customize namespaces 'namespaces' => [ 'controller' => 'App\Http\Controllers', 'model' => 'App\Models', 'validation' => 'App\Validations', 'middleware' => 'App\Http\Middleware', 'service' => 'App\Services', 'observer' => 'App\Observers', ], // Route configuration 'routes' => [ 'middleware' => ['api'], 'use_plural' => true, // email-verifications vs email-verification 'separator' => '-', // email-verifications vs emailVerifications ],
Publishing Base Classes
If you want to customize the base classes:
php artisan vendor:publish --tag=modular-base-classes
This publishes all base classes to your app, allowing you to override and customize them.
Base Classes
ModularController
The base controller provides these methods:
create(Request $request)- Create single or batch recordsread(string $id)- Get a single record by UUIDupdate(Request $request, string $id)- Update a recorddelete(Request $request, ?string $id = null)- Delete single or batchquery(Request $request)- List with filtering, sorting, pagination
Query Parameters
The query method supports:
- Pagination:
?per_page=25 - Sorting:
?sort_by=created_at&sort_order=desc - Filtering:
?filter[status]=active - Search:
?search=john&search_fields=name,email - Eager Loading:
?include=author,comments
Generated Controller
class EmailVerificationController extends ModularController { protected static string $model = EmailVerification::class; protected static string $validation = EmailVerificationValidation::class; // Add custom methods if needed public function customMethod(Request $request) { // Your custom logic } }
ModularModel
The base model includes:
- UUID primary key (
uuidcolumn) - HasUuids trait for automatic UUID generation
- Soft deletes support
- Route key by UUID
Generated Model
class EmailVerification extends ModularModel { protected $table = 'email_verifications'; protected $fillable = [ 'uuid', // Add your fillable attributes here ]; }
ModularValidation
Base validation class with action-based rules:
class EmailVerificationValidation extends ModularValidation { protected static function createRules(Request $request): array { return [ 'email' => ['required', 'email'], ]; } protected static function updateRules(Request $request): array { return [ 'email' => ['sometimes', 'email'], ]; } }
ModularMiddleware
Base middleware with per-action authorization:
class EmailVerificationMiddleware extends ModularMiddleware { protected array $actionMethodMap = [ 'create' => 'authorizeCreate', 'read' => 'authorizeRead', 'update' => 'authorizeUpdate', 'delete' => 'authorizeDelete', 'query' => 'authorizeQuery', ]; protected function authorizeCreate(Request $request): bool { return auth()->user()->can('email-verification.create'); } }
ModularService
Base service with caching and CRUD operations:
class EmailVerificationService extends ModularService { protected static string $model = EmailVerification::class; protected static ?int $cacheDuration = 3600; // Enable caching // Add custom methods public static function findByEmail(string $email): ?EmailVerification { return static::getModel()::where('email', $email)->first(); } }
ModularObserver
Base observer for model lifecycle:
class EmailVerificationObserver extends ModularObserver { public static function getObservedModel(): string { return EmailVerification::class; } public function created(EmailVerification $model): void { // Handle after creation } }
Register in a service provider:
// AppServiceProvider.php public function boot() { EmailVerificationObserver::register(); }
JSON Response Format
// Success { "status": "success", "message": "Record created", "data": { ... } } // Paginated { "status": "success", "message": "Success", "data": [ ... ], "pagination": { "current_page": 1, "last_page": 5, "per_page": 15, "total": 73 } } // Error { "status": "error", "message": "Validation failed", "errors": { "email": ["The email field is required."] } }
Custom Stubs
You can customize the generated file templates:
php artisan vendor:publish --tag=modular-stubs
Then edit files in stubs/modular/ directory.
Testing
composer test
Or run specific tests:
./vendor/bin/phpunit tests/Unit/ ./vendor/bin/pest tests/Feature/
Contributing
Please see CONTRIBUTING for details.
Security
Please see SECURITY for our security policy.
License
The MIT License (MIT). Please see License File for more information.