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-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.