mzaman/laravel-simple-module

Simple module, repository, service pattern for Laravel

v1.0.0 2025-04-22 14:04 UTC

This package is auto-updated.

Last update: 2025-05-11 17:20:02 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
         โ””โ”€โ”€ ${ModuleName}
             โ”œโ”€โ”€ Events
             โ”‚   โ””โ”€โ”€ ${ModuleName}
             โ”‚       โ”œโ”€โ”€ ${ModelName}Created.php
             โ”‚       โ”œโ”€โ”€ ${ModelName}Deleted.php
             โ”‚       โ””โ”€โ”€ ${ModelName}Updated.php
             โ”œโ”€โ”€ Http
             โ”‚   โ”œโ”€โ”€ Controllers
             โ”‚   โ”‚   โ”œโ”€โ”€ Api
             โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ${ModuleName}/${ModelName}Controller.php
             โ”‚   โ”‚   โ”œโ”€โ”€ Backend
             โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ${ModuleName}/${ModelName}Controller.php
             โ”‚   โ”‚   โ””โ”€โ”€ Frontend
             โ”‚   โ”‚       โ””โ”€โ”€ ${ModuleName}/${ModelName}Controller.php
             โ”‚   โ”œโ”€โ”€ Middleware
             โ”‚   โ””โ”€โ”€ Requests
             โ”‚       โ”œโ”€โ”€ Backend/${ModuleName}
             โ”‚       โ”‚   โ”œโ”€โ”€ Delete${ModelName}Request.php
             โ”‚       โ”‚   โ”œโ”€โ”€ Edit${ModelName}Request.php
             โ”‚       โ”‚   โ”œโ”€โ”€ Store${ModelName}Request.php
             โ”‚       โ”‚   โ””โ”€โ”€ Update${ModelName}Request.php
             โ”‚       โ””โ”€โ”€ Frontend/${ModuleName}
             โ”‚           โ””โ”€โ”€ Get${ModelName}Request.php
             โ”œโ”€โ”€ Listeners
             โ”‚   โ””โ”€โ”€ ${ModelName}EventListener.php
             โ”œโ”€โ”€ Models
             โ”‚   โ”œโ”€โ”€ Traits
             โ”‚   โ”‚   โ”œโ”€โ”€ Attribute/${ModelName}Attribute.php
             โ”‚   โ”‚   โ”œโ”€โ”€ Method/${ModelName}Method.php
             โ”‚   โ”‚   โ”œโ”€โ”€ Relationship/${ModelName}Relationship.php
             โ”‚   โ”‚   โ””โ”€โ”€ Scope/${ModelName}Scope.php
             โ”‚   โ””โ”€โ”€ ${ModelName}.php
             โ”œโ”€โ”€ Notifications
             โ”‚   โ””โ”€โ”€ Frontend
             โ”‚       โ””โ”€โ”€ Get${ModuleName}Notification.php
             โ”œโ”€โ”€ Observers
             โ”‚   โ””โ”€โ”€ ${ModelName}Observer.php
             โ”œโ”€โ”€ Rules
             โ”‚   โ””โ”€โ”€ ${ModelName}Rule.php
             โ”œโ”€โ”€ Repository
             โ”‚   โ””โ”€โ”€ ${ModelName}Repository.php
             โ””โ”€โ”€ Services
                 โ””โ”€โ”€ ${ModelName}Service.php

Modules
 โ””โ”€โ”€ BaseModule.php

๐Ÿ“š Here is an example of the directory structure generated by the Laravel Simple Module package:

./
app/ - Laravel application code
โ”œโ”€โ”€ Domains
โ”‚ย ย  โ””โ”€โ”€ V1
โ”‚ย ย      โ””โ”€โ”€ News
โ”‚ย ย          โ”œโ”€โ”€ Events
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ Post
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ PostCreated.php
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ PostDeleted.php
โ”‚ย ย          โ”‚ย ย      โ””โ”€โ”€ PostUpdated.php
โ”‚ย ย          โ”œโ”€โ”€ Http
โ”‚ย ย          โ”‚ย ย  โ”œโ”€โ”€ Controllers
โ”‚ย ย          โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Api
โ”‚ย ย          โ”‚ย ย  โ”‚ย ย      โ””โ”€โ”€ PostApiController.php
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ Requests
โ”‚ย ย          โ”‚ย ย      โ””โ”€โ”€ Api
โ”‚ย ย          โ”‚ย ย          โ””โ”€โ”€ Post
โ”‚ย ย          โ”‚ย ย              โ”œโ”€โ”€ DeletePostRequest.php
โ”‚ย ย          โ”‚ย ย              โ”œโ”€โ”€ EditPostRequest.php
โ”‚ย ย          โ”‚ย ย              โ”œโ”€โ”€ StorePostRequest.php
โ”‚ย ย          โ”‚ย ย              โ””โ”€โ”€ UpdatePostRequest.php
โ”‚ย ย          โ”œโ”€โ”€ Listeners
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ PostEventListener.php
โ”‚ย ย          โ”œโ”€โ”€ Models
โ”‚ย ย          โ”‚ย ย  โ”œโ”€โ”€ Post.php
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ Traits
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ Attribute
โ”‚ย ย          โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ PostAttribute.php
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ Method
โ”‚ย ย          โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ PostMethod.php
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ Relationship
โ”‚ย ย          โ”‚ย ย      โ”‚ย ย  โ””โ”€โ”€ PostRelationship.php
โ”‚ย ย          โ”‚ย ย      โ””โ”€โ”€ Scope
โ”‚ย ย          โ”‚ย ย          โ””โ”€โ”€ PostScope.php
โ”‚ย ย          โ”œโ”€โ”€ Policies
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ Post
โ”‚ย ย          โ”‚ย ย      โ””โ”€โ”€ PostApiPolicy.php
โ”‚ย ย          โ”œโ”€โ”€ Repositories
โ”‚ย ย          โ”‚ย ย  โ””โ”€โ”€ Api
โ”‚ย ย          โ”‚ย ย      โ”œโ”€โ”€ PostApiRepository.php
โ”‚ย ย          โ”‚ย ย      โ””โ”€โ”€ PostApiRepositoryInterface.php
โ”‚ย ย          โ””โ”€โ”€ Services
โ”‚ย ย              โ””โ”€โ”€ Api
โ”‚ย ย                  โ”œโ”€โ”€ PostApiService.php
โ”‚ย ย                  โ””โ”€โ”€ PostApiServiceInterface.php
โ”œโ”€โ”€ Interfaces
โ”‚ย ย  โ””โ”€โ”€ BaseInterface.php
โ”œโ”€โ”€ Repositories
โ”‚ย ย  โ”œโ”€โ”€ BaseRepository.php
โ”‚ย ย  โ”œโ”€โ”€ BaseRepositoryInterface.php
โ””โ”€โ”€ Services
    โ”œโ”€โ”€ BaseApiService.php
    โ”œโ”€โ”€ BaseApiServiceInterface.php
    โ”œโ”€โ”€ BaseService.php
    โ””โ”€โ”€ BaseServiceInterface.php

๐Ÿš€ Artisan Commands

Directory Separator

  • On Windows, the directory separator is \.
  • On macOS and other Unix-based systems (Linux, etc.), the directory separator is /.

To ensure compatibility, always use the appropriate separator for your operating system.

๐Ÿ”ง 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.