Le code doit respecter autant que possible :
Une classe doit avoir une seule responsabilité.
Éviter les classes fourre-tout comme :
Préférer des services ciblés :
Le code doit être extensible sans modification excessive du code existant.
Préférer :
Éviter les gros blocs conditionnels difficiles à maintenir.
Une classe enfant doit pouvoir remplacer sa classe parente sans casser le comportement attendu.
Ne pas utiliser l’héritage pour partager du code par confort.
Préférer la composition.
Les interfaces doivent rester petites et ciblées.
Éviter les interfaces génériques trop larges.
Bon :
interface PdfGeneratorInterface
{
public function generateFromHtml(string $html): string;
}
Mauvais :
interface ApplicationServiceInterface
{
public function generatePdf(): void;
public function uploadFile(): void;
public function sendEmail(): void;
}
Les services doivent dépendre d’abstractions lorsque cela apporte une vraie valeur.
Bon usage :
Ne pas créer une interface inutile pour chaque classe.
Le code doit séparer clairement :
Interface utilisateur
↓
Application
↓
Domaine
↓
Infrastructure
Dans Symfony :
Controller
↓
Service / Use Case
↓
Entity / Value Object
↓
Repository / Infrastructure
Les contrôleurs doivent rester fins.
Ils peuvent :
Ils ne doivent pas contenir :
Les services doivent porter les cas d’usage applicatifs.
Bon :
UserProfileUpdater
AvatarUploader
PdfGenerator
À éviter :
UserManager
AppHelper
CommonService
UtilityService
Les entités doivent contenir :
Elles ne doivent pas contenir :
Utiliser des DTO ou Value Objects quand cela améliore la lisibilité.
Exemples :
Ne pas créer de DTO inutile pour chaque formulaire simple.
Prefer moving presentation logic to the component class.
Good:
public function getVariantClasses(): string
public function getIcon(): string
public function getOptions(): array
Bad:
{% elseif variant == 'warning' %}
{% elseif variant == 'danger' %}
Twig templates should primarily render data.
Complex conditionals should be implemented in PHP.
Les repositories doivent gérer l’accès aux données.
Ils peuvent contenir :
Ils ne doivent pas contenir :
Les noms doivent décrire l’intention.
Bon :
UpdateUserProfileHandler
GeneratePdfFromHtml
UserAvatarUploader
Mauvais :
ProcessData
DoStuff
HandleManager
Utils
Ne pas sur-abstraire.
Créer une abstraction seulement si :
Toujours produire le plus petit changement possible.
Ne pas :
Ne jamais ajouter de dépendance Composer ou npm sans justification claire.
Avant d’ajouter une dépendance :
Les erreurs doivent être explicites.
Préférer :
throw new UnableToGeneratePdfException();
à :
throw new \Exception('Error');
Tout comportement important doit être couvert par des tests.
Les tests doivent rester :
Le code doit rester simple, lisible, testable et maintenable.
Ne pas chercher une architecture parfaite au détriment de la compréhension.
How can I help you explore Laravel packages today?