Patterns approuvés
Utiliser ces patterns sauf si le code existant dans le module cible utilise clairement un standard local différent.
Tableau de référence
| Préoccupation | Pattern |
|---|---|
| Validation | Classes Form Request |
| Autorisation | Policies, gates, middleware can |
| Logique métier | Services |
| Requêtes répétées | Repositories ou query scopes |
| Persistance multi-write | DB::transaction() |
| Formatage de sortie | API Resources ou ViewModels |
| Travail asynchrone | Queued jobs et listeners |
| Réutilisation UI | Composants Blade |
| Settings module | Application->getSetting('key') depuis core_applications |
| Provider IA | AiProviderConfigService — jamais hardcodé |
| Champs sensibles | Cast Eloquent 'encrypted' |
Flux de référence
Route → Middleware → Form Request → Policy → Controller → Service → Model/Repository → Log/Event → Response
Exemple — bon pattern
// Form Request
class StoreUserRequest extends FormRequest
{
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:150'],
'id_service' => ['required', 'integer', 'exists:services,id_service'],
'id_role' => ['required', 'integer', 'exists:roles,id_role'],
];
}
}
// Controller
public function store(StoreUserRequest $request): RedirectResponse
{
$this->authorize('create', User::class);
$user = $this->userService->create($request->validated());
return redirect()->route('admin.users.edit', $user)->with('success', 'Créé.');
}
// Service
public function create(array $data): User
{
return DB::transaction(function () use ($data): User {
$user = User::create($data);
Log::info('User created', ['id_user' => $user->id_user]);
return $user;
});
}