Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Modularity Laravel Package

wandypurnomo/modularity

Laravel package for building modular applications with a clean module structure. Organize features into self-contained modules, manage module discovery and loading, and keep codebases scalable and maintainable.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require wandypurnomo/modularity
    

    Publish the package configuration (if needed):

    php artisan vendor:publish --provider="Wandypurnomo\Modularity\ModularityServiceProvider"
    
  2. Basic Module Creation Use the make:module Artisan command to scaffold a new module:

    php artisan make:module [module-name] [--type=module|package]
    

    Example:

    php artisan make:module Blog --type=module
    

    This generates:

    • A dedicated Modules/Blog directory with:
      • Http/Controllers/ (for module-specific controllers)
      • Providers/ (module service provider)
      • Routes/ (module routes)
      • Views/ (module-specific Blade views)
      • Database/Migrations/ (module migrations)
  3. First Use Case: Isolated Routes Define routes in Modules/Blog/Routes/web.php:

    Route::prefix('blog')->group(function () {
        Route::get('/', 'BlogController@index');
    });
    

    Register the module routes in Modules/Blog/Providers/BlogServiceProvider.php:

    public function boot()
    {
        $this->loadRoutesFrom(__DIR__.'/../Routes/web.php');
    }
    

Implementation Patterns

1. Modular Service Providers

  • Registration: Register module providers in config/modularity.php under providers.
  • Lazy Loading: Use whenIsLoaded() to defer module initialization:
    public function boot()
    {
        if ($this->app->isLoaded('Blog')) {
            $this->loadViewsFrom(__DIR__.'/../Views', 'blog');
        }
    }
    

2. Isolated Configuration

  • Store module-specific config in config/modules/blog.php.
  • Access via:
    config('modules.blog.key');
    
  • Publish module config:
    php artisan vendor:publish --tag=blog-config
    

3. Database Migrations

  • Run module migrations separately:
    php artisan module:migrate Blog
    
  • Rollback:
    php artisan module:migrate:rollback Blog
    

4. Views and Assets

  • Views: Use view('blog::template') for module-specific Blade files.
  • Assets: Publish module assets (CSS/JS) via:
    $this->publishes([
        __DIR__.'/../Resources/assets' => public_path('vendor/blog'),
    ], 'blog-assets');
    

5. Dependency Management

  • Declare module dependencies in config/modules/blog.php:
    'dependencies' => ['Auth', 'Cache'],
    
  • Ensure dependencies are loaded via modularity:load:
    php artisan modularity:load Blog
    

6. APIs and Middleware

  • Register module middleware in BlogServiceProvider:
    $this->app['router']->aliasMiddleware('blog.auth', \Modules\Blog\Http\Middleware\Authenticate::class);
    
  • Apply middleware to routes:
    Route::middleware(['blog.auth'])->group(function () {
        // Protected routes
    });
    

7. Commands and Jobs

  • Place module-specific commands in Modules/Blog/Console/Commands.
  • Register in BlogServiceProvider:
    $this->commands([
        \Modules\Blog\Console\Commands\BlogCommand::class,
    ]);
    

Gotchas and Tips

1. Module Loading Order

  • Issue: Circular dependencies between modules may cause boot failures.
  • Fix: Explicitly define load order in config/modularity.php:
    'load_order' => ['Auth', 'Blog', 'Settings'],
    

2. Route Caching

  • Gotcha: Module routes must be re-cached after changes:
    php artisan route:clear
    php artisan route:cache
    
  • Tip: Use php artisan route:list to debug route conflicts.

3. Namespace Collisions

  • Issue: Modules with identical class names (e.g., UserController) will conflict.
  • Fix: Use fully qualified namespaces:
    \Modules\Blog\Http\Controllers\UserController::class
    

4. Service Provider Binding

  • Gotcha: Bind interfaces to module implementations in BlogServiceProvider:
    $this->app->bind(
        \Modules\Blog\Contracts\PostRepository::class,
        \Modules\Blog\Repositories\PostRepository::class
    );
    
  • Tip: Use whenIsLoaded() to avoid binding errors:
    if ($this->app->isLoaded('Blog')) {
        $this->app->bind(...);
    }
    

5. Migration Conflicts

  • Gotcha: Running php artisan migrate may skip module migrations.
  • Fix: Always use php artisan module:migrate [module] for isolated migrations.

6. View/Asset Publishing

  • Tip: Use symbolic links for shared assets:
    php artisan vendor:publish --tag=blog-assets --link
    

7. Debugging Module Load Issues

  • Tip: Check loaded modules with:
    \Wandypurnomo\Modularity\Facades\Modularity::loaded();
    
  • Debug: Enable verbose output:
    php artisan modularity:load Blog --verbose
    

8. Extending the Package

  • Custom Module Types: Override ModuleCreator in app/Providers/ModularityServiceProvider.php:
    $this->app->bind('module.creator', function () {
        return new \App\Services\CustomModuleCreator();
    });
    
  • Events: Listen for module events (e.g., ModuleLoaded):
    \Wandypurnomo\Modularity\Events\ModuleLoaded::class
    

9. Performance

  • Tip: Disable unused modules in config/modularity.php:
    'disabled' => ['DeprecatedModule'],
    

10. Testing

  • Tip: Mock module dependencies in tests:
    $this->app->shouldLoad('Blog');
    $this->app->shouldLoad('Auth');
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
aimeos/prisma
besmartand-pro/php-quality-config
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor
spatie/laravel-javascript-views