Search code examples
phplaravellaravel-routing

Automatic Module-Based Route Generation in Laravel Using Directories: Is It a Good Approach?


I have been working on a Laravel project where I needed to organize my codebase using modules. To achieve this, I created separate directories for each module under the app/Modules folder. One challenge I faced was generating routes automatically for each module without explicitly defining them.

After some research and experimentation, I came up with the following approach:

    if (File::isDirectory(MODULE_PATH)) {
        $moduleDirectories = File::directories(MODULE_PATH);
            foreach ($moduleDirectories as $directory){
              $module = basename($directory);
                Route::prefix(lcfirst($module))->group(function () use ($module) {
                  require_once app_path("Modules/{$module}/Routes/api.php");
                });
            }
    }

In this approach, I check if the MODULE_PATH directory exists (which points to the app/Modules folder). If it does, I iterate through each module directory. For each module, I extract the module name using basename($directory) and set it as the route prefix using Route::prefix(lcfirst($module)).

Inside the route group, I include the module's API routes by requiring the api.php file located in the module's directory. This allows me to define module-specific routes in separate files, keeping the codebase clean and organized.

Now, my application automatically generates routes for each module based on the module directories present in the app/Modules folder.

I would like to know if this approach is considered a good practice in Laravel development. Are there any potential drawbacks or better alternatives for achieving automatic module-based route generation using directories?

I appreciate any insights or suggestions from the Laravel community. Thank you!


Solution

  • Can this routes be cached?

    The "correct" Laravel way would be for each module to define it's RouteServiceProvider with it's own prefix and load the routes from there.