mzaman / laravel-simple-module
Simple module, repository, service pattern for Laravel
Requires
- php: ^8.0|^8.1|^8.2|^8.3
- illuminate/contracts: ^9.0 || ^10.0
- illuminate/database: ^9.0 || ^10.0
- illuminate/support: ^9.0 || ^10.0
- spatie/async: ^1.6
- spatie/laravel-package-tools: ^1.14.0
- symfony/process: ^6.4 || ^7.0
Requires (Dev)
- larastan/larastan: ^2.0
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.9
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- pestphp/pest: ^2.0
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/laravel-ray: ^1.26
This package is auto-updated.
Last update: 2025-04-23 08:13:34 UTC
README
This package provides a set of powerful and flexible Artisan commands to streamline your development. It's especially suited for DDD (Domain-Driven Design) or modular architectures in laravel. This simple and customizable package enables you to rapidly scaffold modules with repository-service pattern in a Laravel application using a clean structure that includes Models, Traits, Controllers, Services, Repositories, Events, Listeners, and more โ all following your custom directory conventions.
๐งฐ Features
Create modular components with a single command Automatically generates layered architecture (API, Backend, Frontend) Supports Events, Listeners, Repositories, Services, Requests, Policies, Views Minimal configuration needed Fully customizable module path and namespace
๐ฆ Requirements
- Minimum PHP ^8.1 Laravel ^9.0 or ^10.0
๐ Installation
Install via Composer:
You can install the package via composer for latest version
composer require mzaman/laravel-simple-module
Then publish the config file (โ ๏ธ must be published for proper usage):
php artisan vendor:publish --provider="LaravelSimpleModule\LaravelSimpleModuleServiceProvider" --tag="simple-module-config"
This will create a config/simple-module.php file, where you can set default module paths, namespaces, and component settings.
โ๏ธ Configuration (config/simple-module.php)
return [ "request_directory" => "app/Requests", "request_namespace" => "App\Requests", "module_directory" => "app/Modules", "module_namespace" => "App\Modules", "interface_directory" => "app/Interfaces", "interface_namespace" => "App\Interfaces", "abstract_directory" => "app/Abstracts", "abstract_namespace" => "App\Abstracts", "model_directory" => "app/Models", "model_namespace" => "App\Models", "policy_directory" => "app/Policies", "policy_namespace" => "App\Policies", "repository_directory" => "app/Repositories", "repository_namespace" => "App\Repositories", "service_directory" => "app/Services", "service_namespace" => "App\Services", ];
๐งช Example Usage
๐ฏ Generate a Complete Module
php artisan make:module Blog
You will be prompted to:
- Select layers (API, Backend, Frontend)
- Enter model names (e.g.,
Post, Comment
) - Choose which components to generate (Models, Events, Listeners, Controllers, Requests, etc.)
The module will be generated at:
app/Modules/Blog/
โโโ Events/
โโโ Http/
โ โโโ Controllers/
โโโ Listeners/
โโโ Models/
โโโ Policies/
โโโ Repositories/
โโโ Requests/
โโโ Services/
โโโ Traits/
โโโ Views/
โ๏ธ Optional Flags
You can customize the generation path or force overwrite existing files:
php artisan make:module Blog --path=custom/modules --force
๐งฑ What It Generates
Given a model Post
and choosing API layer, you will get:
Models/Post.php
Repositories/PostApiRepository.php
Services/PostApiService.php
Http/Controllers/Api/PostApiController.php
Requests/StorePostRequest.php
,UpdatePostRequest.php
Events/PostCreated.php
,PostUpdated.php
, etc.Listeners/PostEventListener.php
Migrations
,Seeders
,Factories
if selected
๐ Auto-Binding
The package automatically binds:
PostApiRepositoryInterface => PostApiRepository PostApiServiceInterface => PostApiService
So you can type-hint interfaces in your controllers and services.
๐ Example Controller Usage
<?php
namespace App\Modules\Blog\Services\Api;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Database\QueryException;
use App\Modules\Blog\Repositories\Api\PostApiRepository;
use \Exception;
/**
* Class PostApiService.
*
* @extends \App\Services\BaseApiService
* @implements PostApiServiceInterface
*/
class PostApiService extends \App\Services\BaseApiService implements PostApiServiceInterface {
/**
* Set message api for CRUD
* @param string $title
* @param string $create_message
* @param string $update_message
* @param string $delete_message
*/
protected $title = "";
protected $create_message = "";
protected $update_message = "";
protected $delete_message = "";
/**
* Don't change $this->repository variable name
* because used in extends service class
*/
protected $repository;
public function __construct(PostApiRepository $repository)
{
$this->repository = $repository;
}
// Additional methods specific to PostApiService
// New methods for the Api Service
}
๐ File Structure
Below is the standard directory structure generated by the command tools:
app
โโโ Domains
โโโ V1
โโโ ${Module}
โโโ Events
โ โโโ ${Module}
โ โโโ ${Model}Created.php
โ โโโ ${Model}Deleted.php
โ โโโ ${Model}Updated.php
โโโ Http
โ โโโ Controllers
โ โ โโโ Api
โ โ โ โโโ ${Module}/${Model}Controller.php
โ โ โโโ Backend
โ โ โ โโโ ${Module}/${Model}Controller.php
โ โ โโโ Frontend
โ โ โโโ ${Module}/${Model}Controller.php
โ โโโ Middleware
โ โโโ Requests
โ โโโ Backend/${Module}
โ โ โโโ Delete${Model}Request.php
โ โ โโโ Edit${Model}Request.php
โ โ โโโ Store${Model}Request.php
โ โ โโโ Update${Model}Request.php
โ โโโ Frontend/${Module}
โ โโโ Get${Model}Request.php
โโโ Listeners
โ โโโ ${Model}EventListener.php
โโโ Models
โ โโโ Traits
โ โ โโโ Attribute/${Model}Attribute.php
โ โ โโโ Method/${Model}Method.php
โ โ โโโ Relationship/${Model}Relationship.php
โ โ โโโ Scope/${Model}Scope.php
โ โโโ ${Model}.php
โโโ Notifications
โ โโโ Frontend
โ โโโ Get${Module}Notification.php
โโโ Observers
โ โโโ ${Model}Observer.php
โโโ Rules
โ โโโ ${Model}Rule.php
โโโ Repository
โ โโโ ${Model}Repository.php
โโโ Services
โโโ ${Model}Service.php
Modules
โโโ BaseModule.php
๐ Artisan Commands
๐ง Service Generator
php artisan make:service App\Domains\V1\Analytics\Services\ChannelBackendService
๐งฑ Model Generator
With optional generators:
php artisan make:model Channel --path=App\Domains\V1\Analytics\Models --trait --service --repository --requests --policy --force
Examples:
php artisan make:model App\Domains\V1\Test\Models\Dummy --trait --service --repository php artisan make:model App\Domains\V1\Test\Models\Dummy --all php artisan make:model App\Domains\V1\Test_a\Models\Dummy --service=DemoService --repository=DemoRepository
๐งฌ Trait Generator
php artisan make:trait App\Domains\V1\Test_a\Models\Traits\Dummy_testApiTrait
๐ฆ Module Generator
php artisan make:module App\Domains\V1\Subscription
๐ง Interface Generator
php artisan make:interface App\Domains\V1\Test_a\Models\Traits\Dummy_testApi
๐ View Generator
php artisan make:view backend/plan/show
๐ฎ Controller Generator
php artisan make:controller App\Domains\V1\Test\Http\Controllers\Api\DummyApiController --requests --repository --service --policy
With model:
php artisan make:controller App\Domains\V1\Test\Http\Controllers\Api\DummyApiController --model=App\Domains\V1\Test\Models\Dummy --api --requests --repository --service --policy
๐งฉ Flags Reference
Flag | Description |
---|---|
--trait |
Generate trait structure for Attribute, Scope, etc. |
--service |
Create a Service class for the model |
--repository |
Create a Repository class for the model |
--requests |
Generate request classes (Store, Update, etc.) |
--policy |
Generate a Policy file |
--api |
Generate a REST-style API controller |
--resource |
Include resource methods in controller |
--plain |
Generate plain class without extra logic |
--all |
Generate everything (trait, service, repository, etc.) |
--force |
Overwrite existing files |
--model |
Specify model class for controller |
--path |
Override the default path for file generation |
๐ Notes
- All generation paths/namespaces are configurable in
config/simple-module.php
- Designed to support modular and scalable Laravel architecture
- Compatible with Laravel's service-repository and policy-driven design
๐งช Testing
rm -rf vendor composer.lock && composer install && composer exec -- testbench test
License
The MIT License (MIT). Please see License File for more information.