| name | package-based-architecture |
| description | Build self-contained packages/modules where each module has its own controllers, models, views, routes, and service provider. CorePackage provides the shared UI layout and Blade component library used by all modules. Enables true modularity and independent feature development with complete separation of concerns. |
Package-Based Architecture Skill
Monorepo Context
Laravel lives in the laravel/ subdirectory. All paths below are relative to laravel/.
school-management-app/
โโโ laravel/ โ PHP Laravel app (all paths below are relative to this)
โโโ django/ โ Python Django service
โโโ docker/ โ Docker orchestration
Architecture Overview
Each module is a self-contained package under app/Packages/{ModuleName}/ with complete isolation.
CorePackage is the shared foundation โ it owns the app layout, navigation, and the entire UI component library.
app/Packages/
โโโ CorePackage/ โ SHARED FOUNDATION (UI + Layout)
โ โโโ src/
โ โโโ Controllers/
โ โ โโโ BaseController.php
โ โโโ Models/
โ โ โโโ BaseModel.php
โ โโโ Providers/
โ โ โโโ CorePackageServiceProvider.php โ registers components
โ โโโ Resources/
โ โโโ views/
โ โโโ layouts/
โ โ โโโ app.blade.php โ sidebar layout
โ โโโ components/
โ โโโ card.blade.php
โ โโโ page-header.blade.php
โ โโโ badge.blade.php
โ โโโ alert.blade.php
โ โโโ btn.blade.php
โ โโโ stats-card.blade.php
โ โโโ form/
โ โโโ input.blade.php
โ โโโ select.blade.php
โ โโโ textarea.blade.php
โ โโโ section.blade.php
โโโ StudentManagement/
โ โโโ src/
โ โโโ Controllers/
โ โ โโโ StudentController.php (Web)
โ โ โโโ Api/
โ โ โโโ StudentApiController.php (API)
โ โโโ Models/
โ โ โโโ Student.php
โ โ โโโ ParentInfo.php
โ โ โโโ PreviousEducation.php
โ โ โโโ HealthRecord.php
โ โ โโโ StudentEnrollment.php
โ โ โโโ PromotionHistory.php
โ โ โโโ StudentDocument.php
โ โ โโโ StudentActivityLog.php
โ โ โโโ StudentContact.php
โ โโโ Views/
โ โ โโโ student/
โ โ โโโ index.blade.php โ uses x-core-package::*
โ โ โโโ create.blade.php โ uses x-core-package::form.*
โ โ โโโ show.blade.php โ two-column detail layout
โ โ โโโ edit.blade.php โ same as create, prefilled
โ โโโ Routes/
โ โ โโโ web.php
โ โ โโโ api.php
โ โโโ Providers/
โ โ โโโ StudentManagementServiceProvider.php
โ โโโ Database/
โ โโโ migrations/ โ 9 migration files
โโโ StaffManagement/
โโโ ClassManagement/
โโโ ... (more modules)
CorePackage โ Shared UI Foundation
CorePackageServiceProvider does three things:
- Loads the layout + component views under namespace
core-package
- Registers anonymous Blade components via
anonymousComponentPath so all modules can use <x-core-package::card>, <x-core-package::btn>, etc.
- Provides
BaseController and BaseModel for inheritance
All module views must:
@extends('core-package::layouts.app') โ uses the shared sidebar layout
- Use
<x-core-package::*> components for all UI (see ui-design-components skill)
public function boot(): void
{
$this->loadViewsFrom(__DIR__.'/../Resources/views', 'core-package');
$this->callAfterResolving(BladeCompiler::class, function (BladeCompiler $blade) {
$blade->anonymousComponentPath(
__DIR__.'/../Resources/views/components',
'core-package'
);
});
}
Module Service Provider Pattern
Each package includes a ServiceProvider that:
- Loads views with namespace prefix:
student-management::student.index
- Loads migrations from package directory
- Registers and groups routes (web & API)
- Can register other services (gates, policies, events)
StudentManagementServiceProvider
class StudentManagementServiceProvider extends ServiceProvider
{
public function boot()
{
$this->loadMigrationsFrom(__DIR__ . '/../Database/migrations');
$this->loadViewsFrom(__DIR__ . '/../Views', 'student-management');
$this->registerRoutes();
}
private function registerRoutes()
{
Route::middleware('web')
->namespace('App\Packages\StudentManagement\Controllers')
->group(__DIR__ . '/../Routes/web.php');
Route::middleware('api')
->prefix('api')
->namespace('App\Packages\StudentManagement\Controllers')
->group(__DIR__ . '/../Routes/api.php');
}
}
Registration
Register package providers in laravel/bootstrap/providers.php:
return [
AppServiceProvider::class,
StudentManagementServiceProvider::class,
StaffManagementServiceProvider::class,
ClassManagementServiceProvider::class,
];
Routes
Main route files (laravel/routes/web.php and laravel/routes/api.php) remain clean โ packages handle their own routes via ServiceProvider.
Models
namespace App\Packages\StudentManagement\Models;
class Student extends Model { }
Creating New Laravel Packages
- Create folder:
app/Packages/{ModuleName}/src/
- Create subdirectories: Controllers, Models, Views, Routes, Providers, Database/migrations
- Create ServiceProvider
- Register in
laravel/bootstrap/providers.php
- Add autoload entry in
laravel/composer.json under psr-4
- Run
composer dump-autoload from laravel/
Benefits
โ
Complete Isolation: Each module is independent
โ
Easy to Remove: Delete package folder to remove feature
โ
Clear Dependencies: Package routes/controllers define public API
โ
Scalability: Add packages without touching core
โ
Testing: Package can be tested in isolation
Goals
- 100% package-based architecture for all modules
- Zero dependencies between packages (except through models/APIs)
- Independent deployment and testing per package