Installation
composer require binetvn/laravel-app
Publish the package configuration (if needed):
php artisan vendor:publish --provider="Binetvn\LaravelApp\LaravelAppServiceProvider" --tag="config"
First Use Case: Basic Module Structure
Create a new module (e.g., UserManagement) using the package’s scaffolding:
php artisan app:module UserManagement
This generates:
app/Modules/UserManagement/
Http/Controllers/ (API/HTTP controllers)Repositories/ (Eloquent/Repository interfaces)Services/ (Business logic)Resources/ (Views, JSON responses)Routes/ (Module-specific routes)Database/Migrations/ (Module migrations)Register the Module
Add the module to config/app.php under modules:
'modules' => [
'Binetvn\LaravelApp\Modules\UserManagement\UserManagementModule',
],
Run migrations:
php artisan migrate
First Route
Define a route in app/Modules/UserManagement/Routes/web.php:
Route::get('/users', 'UserController@index');
The package auto-loads module routes when the module is registered.
// app/Modules/UserManagement/Routes/web.php
Route::prefix('admin')->group(function () {
Route::resource('users', 'UserController');
});
Route::middleware(['auth', 'admin'])->group(function () {
// Module routes
});
// app/Modules/UserManagement/Repositories/UserRepository.php
public function findAll()
{
return User::all();
}
public function index(UserRepository $repository)
{
return $repository->findAll();
}
// app/Modules/UserManagement/Services/UserService.php
public function createUser(array $data)
{
$user = User::create($data);
// Add custom logic (e.g., send welcome email)
return $user;
}
public function store(Request $request, UserService $service)
{
return $service->createUser($request->all());
}
// app/Modules/UserManagement/Resources/ApiResponse.php
public static function success($data, $message = null)
{
return response()->json([
'success' => true,
'data' => $data,
'message' => $message,
]);
}
return ApiResponse::success($user);
php artisan make:migration create_users_table --module=UserManagement
Migrations are auto-loaded from app/Modules/{Module}/Database/Migrations/.// app/Modules/UserManagement/Resources/views/users/index.blade.php
return view('UserManagement::users.index');
php artisan app:publish-assets UserManagement
// tests/Module/UserManagement/UserTest.php
public function test_user_creation()
{
$response = $this->post('/api/users', ['name' => 'Test']);
$response->assertStatus(201);
}
ModuleTestCase (if provided by the package) to mock dependencies.Route Caching Conflicts
php artisan route:clear
config/app.php before routes are cached.Service Provider Order
config/app.php order.Migration Paths
app/Modules/{Module}/Database/Migrations/ or they won’t auto-load.php artisan migrate --path=app/Modules/{Module}/Database/Migrations for targeted migrations.Namespace Collisions
Auth, Cache). Use prefixes like UserManagement.Dependency Injection Issues
App\Modules\{Module}\ namespace.Check Module Registration
Run php artisan app:list-modules to verify registered modules.
Route Debugging
Use php artisan route:list to see if module routes appear. Filter by module prefix.
Service Binding Dump the service container to check bindings:
dd(app()->bindings());
Configuration Overrides Publish and override config:
php artisan vendor:publish --tag="app-config"
Modify config/app.php under the modules section.
Custom Module Templates Override scaffolding templates by publishing and modifying:
php artisan vendor:publish --tag="app-module-templates"
Dynamic Module Loading
Load modules conditionally in AppServiceProvider:
if (config('app.enable_user_module')) {
$this->app->register(\App\Modules\UserManagement\UserManagementModule::class);
}
Event Handling Dispatch module-specific events:
// In a service
event(new \App\Modules\UserManagement\Events\UserCreated($user));
Listen in EventServiceProvider:
protected $listen = [
'App\Modules\UserManagement\Events\UserCreated' => [
'App\Modules\UserManagement\Listeners\SendWelcomeEmail',
],
];
API Versioning Use route prefixes for versioning:
Route::prefix('v1')->group(function () {
// Module routes
});
Localization Isolate translations per module:
php artisan lang:publish --module=UserManagement
Load translations in views:
@lang('UserManagement::messages.welcome')
How can I help you explore Laravel packages today?