kadevland/laravel-easy-modules

Laravel module generator with extensive Artisan commands for rapid modular development. Customizable architecture patterns including Clean Architecture templates.

1.0.0 2025-06-01 13:23 UTC

This package is auto-updated.

Last update: 2025-06-01 13:44:45 UTC


README

Latest Version on Packagist Total Downloads GitHub Actions License

Package Status: This package has been tested and works correctly for most use cases. However, some edge cases may require manual handling depending on your specific setup.

Laravel Easy Modules is a flexible Laravel package that enables you to organize your application using modular architecture. Generate organized, maintainable applications with automatic component registration and structured code separation. Clean Architecture templates are provided as sensible defaults, but fully customizable to your needs.

โœจ Key Features

  • ๐Ÿ—๏ธ Flexible Module Generation - Customizable architecture patterns with sensible defaults
  • โšก Extensive Artisan Commands - Complete toolkit for rapid modular development
  • ๐Ÿ”„ Auto-Discovery - Automatic module registration and loading
  • ๐ŸŽฏ Fully Customizable - Adapt any folder structure and architectural pattern
  • ๐Ÿš€ Developer Friendly - Simple commands with intelligent defaults
  • ๐Ÿ›๏ธ Clean Architecture Ready - Pre-configured templates for Domain, Application, Infrastructure, and Presentation layers
  • ๐Ÿ› ๏ธ Development Toolkit - Optimized for development workflow with minimal production footprint
  • ๐Ÿ†• Laravel 12 Ready - Full compatibility with Laravel 12's latest features

๐Ÿš€ Installation & Quick Start

Requirements

  • Laravel 12+ - Built specifically for Laravel 12
  • PHP 8.2+ - Required by Laravel 12
  • Composer - For package management

Installation

Install via Composer:

composer require --dev kadevland/laravel-easy-modules

Publish configuration:

# Default way
php artisan vendor:publish --provider="Kadevland\EasyModules\EasyModulesServiceProvider" --tag="config"

# Using Laravel Easy Modules command
php artisan easymodules:publish

# Publish with options
php artisan easymodules:publish --all      # Config & stubs
php artisan easymodules:publish --stubs    # Stubs only
php artisan easymodules:publish --force    # Force overwrite

Create your first module:

# Single module
php artisan easymodules:new Blog

# Multiple modules
php artisan easymodules:new Blog User Product

# Using aliases
php artisan emodules:new Shop
php artisan emodule:new Auth

๐Ÿ“ What Gets Generated

When you run php artisan easymodules:new Blog, you get a complete Clean Architecture structure by default, but this is fully customizable to match your preferred architecture pattern:

๐Ÿ“ Note: This structure is just the default template. You can completely customize the folder structure, paths, and architectural patterns through configuration. See Configuration Guide for details.

app/Modules/Blog/
โ”œโ”€โ”€ ๐Ÿ“ Application/              # ๐ŸŽฏ Use Cases & Business Logic
โ”‚   โ”œโ”€โ”€ Actions/                 # Use case implementations
โ”‚   โ”œโ”€โ”€ DTOs/                    # Data Transfer Objects
โ”‚   โ”œโ”€โ”€ Interfaces/              # Contracts and interfaces
โ”‚   โ”œโ”€โ”€ Mappers/                 # Data transformation logic
โ”‚   โ”œโ”€โ”€ Rules/                   # Business rules validation
โ”‚   โ”œโ”€โ”€ Services/                # Application services
โ”‚   โ””โ”€โ”€ Validation/              # Input validation logic
โ”œโ”€โ”€ ๐Ÿ“ Domain/                   # ๐Ÿง  Core Business Logic
โ”‚   โ”œโ”€โ”€ Entities/                # Domain entities (business models)
โ”‚   โ”œโ”€โ”€ Services/                # Domain services (business logic)
โ”‚   โ””โ”€โ”€ ValueObjects/            # Value objects used in entities
โ”œโ”€โ”€ ๐Ÿ“ Infrastructure/           # ๐Ÿ›๏ธ External Concerns
โ”‚   โ”œโ”€โ”€ Casts/                   # Custom Eloquent casts
โ”‚   โ”œโ”€โ”€ Events/                  # Application events
โ”‚   โ”œโ”€โ”€ Exceptions/              # Custom exceptions for error handling
โ”‚   โ”œโ”€โ”€ Jobs/                    # Queue jobs and background tasks
โ”‚   โ”œโ”€โ”€ Listeners/               # Event listeners
โ”‚   โ”œโ”€โ”€ Mail/                    # Mailable classes
โ”‚   โ”œโ”€โ”€ Mappers/                 # Entity โ†” Model transformation
โ”‚   โ”œโ”€โ”€ Models/                  # Eloquent models (database persistence)
โ”‚   โ”œโ”€โ”€ Notifications/           # Notification classes
โ”‚   โ”œโ”€โ”€ Observers/               # Model observers
โ”‚   โ”œโ”€โ”€ Persistences/            # Repositories and data access
โ”‚   โ”œโ”€โ”€ Policies/                # Authorization policies
โ”‚   โ”œโ”€โ”€ Rules/                   # Validation rules
โ”‚   โ””โ”€โ”€ Services/                # External services integration
โ”œโ”€โ”€ ๐Ÿ“ Presentation/             # ๐ŸŽจ User Interface
โ”‚   โ”œโ”€โ”€ Console/Commands/        # Custom Artisan commands
โ”‚   โ”œโ”€โ”€ Http/Controllers/        # HTTP controllers for request handling
โ”‚   โ”œโ”€โ”€ Http/Middlewares/        # HTTP middleware
โ”‚   โ”œโ”€โ”€ Http/Requests/           # Form requests for validation
โ”‚   โ”œโ”€โ”€ Http/Resources/          # API resources for response formatting
โ”‚   โ”œโ”€โ”€ Mappers/                 # Display-related transformations
โ”‚   โ”œโ”€โ”€ Views/Components/        # Blade components for UI
โ”‚   โ””โ”€โ”€ resources/views/         # Blade templates
โ”œโ”€โ”€ ๐Ÿ“ Database/                 # ๐Ÿ—„๏ธ Database Related
โ”‚   โ”œโ”€โ”€ Factories/               # Model factories for testing
โ”‚   โ”œโ”€โ”€ Migrations/              # Database schema management
โ”‚   โ””โ”€โ”€ Seeders/                 # Database seeders
โ”œโ”€โ”€ ๐Ÿ“ Tests/                    # ๐Ÿงช Testing
โ”‚   โ”œโ”€โ”€ Feature/                 # Integration/Feature tests
โ”‚   โ””โ”€โ”€ Unit/                    # Unit testing
โ”œโ”€โ”€ ๐Ÿ“ Providers/                # ๐Ÿ”ง Service Providers
โ”‚   โ””โ”€โ”€ BlogServiceProvider.php # Auto-generated and registered
โ”œโ”€โ”€ ๐Ÿ“ config/                   # โš™๏ธ Configuration
โ”‚   โ””โ”€โ”€ config.php               # Module-specific configuration
โ”œโ”€โ”€ ๐Ÿ“ routes/                   # ๐Ÿ›ฃ๏ธ Route Definitions
โ”‚   โ”œโ”€โ”€ web.php                  # Web routes (with examples)
โ”‚   โ”œโ”€โ”€ api.php                  # API routes (with examples)
โ”‚   โ””โ”€โ”€ console.php              # Console routes (with examples)
โ””โ”€โ”€ ๐Ÿ“ lang/                     # ๐ŸŒ Translations    

๐Ÿ—๏ธ Modular Architecture Benefits

  • ๐ŸŽฏ Separation of Concerns: Each layer has specific responsibilities
  • ๐Ÿ”„ Testability: Easy to unit test business logic in isolation
  • ๐Ÿ“ˆ Scalability: Add features without affecting existing code
  • ๐Ÿ”ง Maintainability: Clear structure for team collaboration
  • ๐Ÿ† Independence: Domain logic independent of frameworks and databases

๐Ÿ› ๏ธ Commands & Generators

Laravel Easy Modules provides an extensive command toolkit for rapid development:

๐Ÿ‘‰ Complete Command Reference Guide - Full documentation with examples

Quick Examples

# Create a complete blog module
php artisan easymodules:new Blog

# Generate domain components
php artisan easymodules:make-entity Blog Post

# Use familiar Laravel commands in modules
php artisan easymodules:make-model Blog Post --migration --factory

# Flexible component generation with custom stubs
php artisan easymodules:make-stub Blog UserRepository repository
php artisan easymodules:make-stub Shop OrderDTO dto
php artisan easymodules:make-stub User EmailValueObject valueobject

# Get detailed module information
php artisan easymodules:info Blog

# List discovered modules
php artisan easymodules:list --routes

Command Aliases

All commands support these prefixes for convenience:

  • easymodules: (full)
  • emodules: (short)
  • emodule: (shortest)

๐Ÿ”„ Laravel 12 Auto-Discovery

Laravel Easy Modules leverages Laravel 12's enhanced auto-discovery features for seamless integration:

โœ… Automatic Registration

When auto_discover = true, newly created modules are automatically:

  • Registered in bootstrap/providers.php using Laravel's official method
  • Loaded on application startup
  • Available immediately without manual configuration
// bootstrap/providers.php (automatically updated)
return [
    App\Providers\AppServiceProvider::class,
    App\Modules\Blog\Providers\BlogServiceProvider::class, // โ† Auto-added
];

๐Ÿ”ง Manual Registration

You can also register modules manually by adding them directly to bootstrap/providers.php:

// bootstrap/providers.php
return [
    App\Providers\AppServiceProvider::class,
    App\Modules\Blog\Providers\BlogServiceProvider::class,
    App\Modules\User\Providers\UserServiceProvider::class,
    // Add your modules here
];

๐Ÿ—‘๏ธ Manual Unregistration

To disable a module, simply remove or comment its ServiceProvider from bootstrap/providers.php:

// bootstrap/providers.php
return [
    App\Providers\AppServiceProvider::class,
    // App\Modules\Blog\Providers\BlogServiceProvider::class, // โ† Disabled
    App\Modules\User\Providers\UserServiceProvider::class,
];

๐Ÿ—๏ธ Package Independence

Important: All generated code remains fully functional even if you remove Laravel Easy Modules package. Each module generated uses standard Laravel ServiceProvider patterns and can operate independently.

๐Ÿ” List Discovered Modules

View all modules discovered by the auto-discovery system:

# View all discovered modules with detailed information
php artisan easymodules:list --routes

Example output:

๐Ÿ“‹ Laravel Easy Modules - Module Discovery

๐Ÿ“ Base Path: /app/Modules
๐Ÿ“ฆ Base Namespace: App\Modules
๐Ÿ” Auto-Discovery: โœ… Enabled

+---------+------------------+---------------------+-----+-----+---------+
| Module  | Path             | Provider            | Web | API | Console |
+---------+------------------+---------------------+-----+-----+---------+
| Blog    | /app/Modules/Blog| BlogServiceProvider | โœ…  | โœ…  | โŒ      |
| User    | /app/Modules/User| UserServiceProvider | โœ…  | โŒ  | โŒ      |
| Shop    | /app/Modules/Shop| ShopServiceProvider | โœ…  | โœ…  | โœ…      |
+---------+------------------+---------------------+-----+-----+---------+

๐Ÿ“Š Summary:
   Total modules: 3
   With web routes: 3
   With API routes: 2
   With console routes: 1

โš™๏ธ Configuration & Customization

Package Configuration

Customize module generation in config/easymodules.php:

return [
    // Module location and namespace
    'base_path' => app_path('Modules'),
    'base_namespace' => 'App\\Modules',

    // Laravel 12 auto-discovery
    'auto_discover' => true,

    // Custom paths per component
    'paths' => [
        'controller' => 'Presentation/Http/Controllers',
        'model' => 'Infrastructure/Models',
        'entity' => 'Domain/Entities',
        // ... fully customizable
    ],

    // Custom stubs for flexible architecture
    'stubs' => [
        'controller' => 'easymodules/controller.stub',
        'entity' => 'easymodules/entity.stub',
        'dto' => 'easymodules/dto.stub',
        'repository' => 'easymodules/repository.stub',
        // ... your custom templates
    ]
];

Module-Specific Configuration

Each module can have its own configuration for module-specific settings:

// app/Modules/Blog/config/config.php
return [
    'name' => 'Blog',
    'enabled' => true,

    // Your custom settings
    'posts_per_page' => 10,
    'cache_ttl' => 3600,
    'features' => [
        'comments' => true,
        'categories' => true,
        'seo' => true,
    ],
    'seo' => [
        'meta_length' => 160,
        'slug_separator' => '-',
    ],
];

// Access in your code
config('blog.posts_per_page'); // 10
config('blog.features.comments'); // true

Customizable Stubs

# Publish stubs for customization
php artisan easymodules:publish --stubs

# Modify in resources/stubs/easymodules/
# Create your own architectural patterns

Important: No stubs are provided by default - you create them according to your architectural needs using the make-stub system.

๐Ÿงช Testing Configuration

PHPUnit Integration

Add to your phpunit.xml:

<testsuites>
    <testsuite name="Feature">
        <directory suffix="Test.php">./tests/Feature</directory>
        <directory suffix="Test.php">./app/Modules/*/Tests/Feature</directory>
    </testsuite>
    <testsuite name="Unit">
        <directory suffix="Test.php">./tests/Unit</directory>
        <directory suffix="Test.php">./app/Modules/*/Tests/Unit</directory>
    </testsuite>
</testsuites>

Pest Framework Support

Add to your tests/Pest.php:

uses(Tests\TestCase::class)->in('Feature', 'Unit');
uses(Tests\TestCase::class)->in('app/Modules/*/Tests/Feature');
uses(Tests\TestCase::class)->in('app/Modules/*/Tests/Unit');

โšก Vite Integration (Laravel 12)

Laravel 12 uses enhanced Vite configuration. Update your vite.config.js:

import { defineConfig } from "vite";
import laravel from "laravel-vite-plugin";
import tailwindcss from "@tailwindcss/vite";
import { glob } from "glob";

// Auto-discovery of module assets
const moduleAssets = [
    ...glob.sync("app/Modules/*/Presentation/resources/js/**/*.js"),
    ...glob.sync("app/Modules/*/Presentation/resources/css/**/*.css"),
    ...glob.sync("app/Modules/*/Presentation/resources/scss/**/*.scss"),
];

export default defineConfig({
    plugins: [
        laravel({
            input: [
                "resources/css/app.css",
                "resources/js/app.js",
                ...moduleAssets, // Auto-discovered module assets
            ],
            refresh: [
                // Default Laravel refresh
                "resources/views/**",
                "routes/**",
                "app/**",
                // Module-specific refresh
                "app/Modules/*/Presentation/resources/views/**",
                "app/Modules/*/Presentation/Views/Components/**",
                "app/Modules/*/routes/**",
            ],
        }),
        tailwindcss(), // Laravel 12 Tailwind plugin
    ],
    resolve: {
        alias: {
            "@": "/resources/js",
            "@modules": "/app/Modules",
        },
    },
});

Required installation:

npm install glob --save-dev

๐ŸŽจ Tailwind CSS Configuration

Update your tailwind.config.js for module support:

export default {
    content: [
        "./resources/**/*.blade.php",
        "./resources/**/*.js",
        "./resources/**/*.vue",
        "./app/**/*.php",

        // Laravel Easy Modules with Clean Architecture
        "./app/Modules/*/Presentation/resources/views/**/*.blade.php",
        "./app/Modules/*/Presentation/resources/**/*.js",
        "./app/Modules/*/Presentation/resources/**/*.vue",
        "./app/Modules/*/Presentation/Views/Components/**/*.php",
    ],
    theme: {
        extend: {},
    },
    plugins: [],
};

๐Ÿ“– Practical Examples

Blog Module with Rich Configuration

php artisan easymodules:new Blog
// app/Modules/Blog/config/config.php
return [
    'name' => 'Blog',
    'enabled' => true,
    'posts_per_page' => 15,
    'cache' => [
        'posts_ttl' => 3600,
        'categories_ttl' => 7200,
    ],
    'features' => [
        'comments' => true,
        'tags' => true,
        'seo' => true,
        'social_sharing' => true,
    ],
    'seo' => [
        'meta_description_length' => 160,
        'slug_separator' => '-',
        'auto_generate_meta' => true,
    ],
];

E-commerce Modular Setup

# Create separate modules for clean domain separation
php artisan easymodules:new Product Order Payment User Cart Inventory

Each module maintains its own:

  • Domain logic in isolated entities
  • Database schema with dedicated migrations
  • API endpoints with versioned resources
  • Tests for reliable functionality

Multi-tenant Application

# Tenant-specific modules
php artisan easymodules:new Tenant Organization Billing Subscription

๐Ÿ†• Laravel 12 Compatibility

โœ… What's Fully Supported

  • ServiceProvider Auto-Registration - Uses Laravel 12's official addProviderToBootstrapFile method
  • All Essential Laravel Commands - Full compatibility with Laravel's core Artisan commands within modules
  • PHP 8.2+ - Takes advantage of modern PHP features and syntax
  • Enhanced Vite - Works with Laravel 12's improved asset compilation
  • Framework Features - Complete integration with Laravel 12's core functionality

๐Ÿš€ Built for Laravel 12

Laravel Easy Modules is designed specifically for Laravel 12 from the ground up - no migration needed, just clean modular development ready to use.

๐Ÿ› ๏ธ Benefits of Modular Architecture

โœ… Separation of Concerns

  • Domain : Pure business logic, framework-independent
  • Application : Use cases and orchestration logic
  • Infrastructure : Persistence, external services, and technical details
  • Presentation : User interface, APIs, and external communication

โœ… Development Benefits

  • Team Collaboration : Multiple developers can work on different modules
  • Code Organization : Logical grouping by business functionality
  • Reusability : Modules can be extracted as packages
  • Testing : Isolated testing of business logic

โœ… Scalability & Maintenance

  • Independent Deployment : Modules can evolve separately
  • Feature Isolation : New features don't affect existing modules
  • Easier Debugging : Clear boundaries help identify issues
  • Legacy Migration : Gradual modernization of existing applications

๐Ÿ“š Complete Documentation

๐Ÿ”„ Alternative Solutions

If you're looking for modular Laravel development solutions, you might also consider:

nWidart/laravel-modules

A well-established and highly configurable module system for Laravel. Great choice if you prefer maximum flexibility and don't mind setting up your own structure from scratch.

EasyModules vs nWidart:

  • EasyModules: Simple setup, structured defaults, future multi-pattern support, production-independent modules. EasyModules is a dev-tool only - no need to deploy it to production
  • nWidart: Complete flexibility, manual configuration, established ecosystem

Both packages serve the modular development community well - choose based on whether you prefer structured defaults (EasyModules) or complete configurability (nWidart).

๐Ÿ’ญ Philosophy

We created EasyModules because modular development should be simple, fast, and completely independent - remove EasyModules anytime, your code keeps running.

EasyModules believes in empowering developers without creating dependencies. We're here to help you design and scaffold beautiful, maintainable modular architectures using Laravel standards - then we disappear.

Configuration is simple by design. A single config file, clear folder structures, and intelligent defaults get you productive in minutes. No complex setup, no scattered configuration files, no learning curve.

Generated code is entirely yours to modify. EasyModules doesn't check, validate, or enforce anything after generation. Refactor freely, change structures, adapt to your needs - we're here to help, not to impose.

Generated modules are entirely yours. Built with standard Laravel patterns. No vendor lock-in - you choose how to manage your dependencies. Just clean, organized code that lives and breathes Laravel.

"We help you build it right, then get out of your way."

๐Ÿค Contributing

Contributions are welcome! Please see contributing guide.

๐Ÿ“ Changelog

Please see CHANGELOG for more information on recent changes.

๐Ÿ”’ Security

For security issues, please email kadevland@kaosland.net.

๐Ÿ“„ License

Open-source package under MIT license.

๐Ÿ‘จโ€๐Ÿ’ป Credits

Made with โค๏ธ by Kadevland

โญ Star us on GitHub if this project helps you!

Laravel Easy Modules - Flexible modular development made simple ๐Ÿš€