nahid-ferdous/laravel-module-generator
Installation
composer require nahid-ferdous/laravel-module-generator
Publish the config file (if needed):
php artisan vendor:publish --provider="NahidFerdous\ModuleGenerator\ModuleGeneratorServiceProvider"
First Use Case
module.yaml) in your project root or a designated directory.name, namespace, controllers, models, etc.
Example:
name: "Blog"
namespace: "App\\Modules\\Blog"
controllers:
- name: "BlogController"
actions: ["index", "store", "show", "update", "destroy"]
models:
- name: "Post"
fillable: ["title", "content"]
migrations:
- name: "create_posts_table"
columns:
- "title"
- "content"
Generate the Module
php artisan module:generate module.yaml
The package will scaffold files like:
app/Http/Controllers/Modules/Blog/BlogController.phpapp/Models/Modules/Blog/Post.phpposts table.Iterative Development
Auth, Admin, Blog).Team Collaboration
.github/module-templates/).Integration with CI/CD
composer.json to regenerate modules on post-install-cmd:
"scripts": {
"post-install-cmd": [
"php artisan module:generate config/module-templates/*.yaml"
]
}
Custom Templates Override default file templates by publishing the package’s views:
php artisan vendor:publish --tag="module-generator-views"
Modify files in resources/views/module-generator/ to match your project’s coding standards.
Seeding and Factories
Extend the YAML to include seeders or factories:
seeders:
- name: "PostSeeder"
run: true
factories:
- name: "PostFactory"
The package will generate corresponding files in database/seeders/ and database/factories/.
API Resources Define API resources in YAML:
resources:
- name: "PostResource"
fields: ["id", "title", "content"]
Outputs a PostResource.php in app/Http/Resources/.
Request Validation Specify request validation rules:
requests:
- name: "StorePostRequest"
rules:
title: "required|string|max:255"
content: "required|string"
Testing Generate feature tests alongside controllers:
tests:
- name: "BlogControllerTest"
testable: "BlogController"
Namespace Conflicts
namespace in YAML matches your project’s autoload paths. Misconfigured namespaces may cause class-not-found errors.composer dump-autoload runs after generation.Migration File Naming
2023_01_01_create_posts_table.php). If you rename the YAML’s migrations.name, the migration file won’t update automatically.YAML Syntax Errors
Overwriting Existing Files
--dry-run to preview changes:
php artisan module:generate module.yaml --dry-run
Laravel Version Compatibility
composer.json for Laravel version constraints and test thoroughly.Verbose Output Enable debug mode for detailed logs:
php artisan module:generate module.yaml --verbose
Check Generated Files
Inspect the output files for syntax errors (e.g., missing use statements, incorrect method signatures).
Artisan Command Help Review available options:
php artisan module:generate --help
Example flags:
--force: Overwrite files without confirmation.--no-migrations: Skip migration generation.Custom Commands Extend the generator by creating a custom Artisan command:
// app/Console/Commands/CustomModuleGenerate.php
use NahidFerdous\ModuleGenerator\Commands\ModuleGeneratorCommand;
class CustomModuleGenerate extends ModuleGeneratorCommand {
protected $signature = 'module:custom-generate {file} {--force}';
protected $description = 'Generate modules with custom logic';
public function handle() {
// Override logic here
$this->generateModule($this->argument('file'), $this->option('force'));
}
}
Event Listeners
Listen to the module.generated event to post-process files:
// app/Providers/ModuleGeneratorServiceProvider.php
use NahidFerdous\ModuleGenerator\Events\ModuleGenerated;
public function boot() {
ModuleGenerated::listen(function (ModuleGenerated $event) {
// Add custom logic, e.g., inject code into generated files
$event->files['app/Http/Controllers/Modules/Blog/BlogController.php']
->append("protected \$customProperty = 'value';");
});
}
Dynamic YAML Loading Load YAML from a database or API for dynamic module generation:
$yamlContent = Cache::get('dynamic_module_config');
file_put_contents(storage_path('app/module.yaml'), $yamlContent);
Template Overrides Override specific file templates (e.g., controllers) by extending the package’s views:
// config/module-generator.php
'templates' => [
'controller' => 'custom::module-generator.controller',
],
Create resources/views/custom/module-generator/controller.blade.php.
Modular Monorepos Use the generator to scaffold microservices or modules in a monorepo structure. Example YAML:
namespace: "App\\Modules\\{module_name}"
path: "modules/{module_name}"
Configure composer.json to autoload modules:
"autoload": {
"psr-4": {
"App\\Modules\\": "modules/"
}
}
Documentation
Generate a README.md for each module by extending the YAML:
documentation:
- name: "README.md"
content: |
# {module_name} Module
Description: {description}
Features: {features}
Performance For large projects, generate modules in batches or use parallel processing:
find config/module-templates/ -name "*.yaml" | xargs -P 4 php artisan module:generate
How can I help you explore Laravel packages today?