Quand on parle de Laravel, on parle d’élégance, de clarté et de productivité. Mais soyons honnêtes : on a tous déjà copié-collé du code en se disant "je le refactorai plus tard"... et ce "plus tard" n’arrive jamais. Résultat ? Une base de code qui ressemble plus à un plat de spaghettis qu’à une belle architecture modulaire.
Heureusement, Laravel nous offre une panoplie d'outils pour respecter le principe DRY (Don't Repeat Yourself) et éviter de nous répéter inutilement.
Dans cet article, on va explorer les différentes approches pour appliquer DRY en Laravel, du classique Eloquent Scope jusqu’au Component Master, le gardien ultime du code non-répété.
1. Les Eloquent Scopes : DRY ta requête, DRY ta vie
Qu'est-ce qu'un Scope dans Laravel ?
Un scope est une méthode qui encapsule une logique de filtrage réutilisable pour les requêtes de base de données. Il permet de garder le code propre et organisé en évitant la répétition des mêmes conditions de filtrage un peu partout dans ton application.
Types de Scopes
Les Local Scopes sont définis directement dans un modèle Eloquent et sont parfaits pour des filtres spécifiques et récurrents à un modèle donné. Les Global Scopes, quant à eux, s’appliquent automatiquement à toutes les requêtes d’un modèle et sont utiles pour des filtres omniprésents comme les soft deletes.
class User extends Model
{
public function scopeAdmin($query)
{
return $query->where('role', 1);
}
}
// Controller Usage
$admins = User::admin()->get();
2. Les Traits et Services : Arrête de maltraiter ton code
Qu'est-ce que c'est ?
Un mécanisme en PHP permettant de regrouper des méthodes réutilisables dans une classe. Dans Laravel, ils permettent d'ajouter des méthodes communes à plusieurs modèles ou contrôleurs sans dupliquer le code.
Idéal pour : Comportements communs (logs, notifications).
Qu'est-ce que c'est ?
Une classe contenant une logique métier spécifique. Il est utilisé pour encapsuler des fonctionnalités complexes qui ne relèvent pas directement des responsabilités d'un modèle ou d'un contrôleur.
Idéal pour : Logique métier complexe et testable.
Le Verdict : Quand utiliser quoi ?
Si un trait commence à regrouper trop de fonctionnalités différentes, il est préférable de créer un service. Un service permet de séparer les responsabilités et de rendre le code plus modulaire.
En résumé : Traits = fonctionnalités simples et réutilisables. Services = logique métier structurée et centralisée.
3. Les Middlewares : DRY tes vérifications globales
Le Videur de Boîte
Il contrôle qui entre et qui reste dehors !
Qu'est-ce que c'est ?
Un middleware est une couche de logique qui s'exécute entre la réception d'une requête par le serveur et le moment où elle atteint ton application.
Pourquoi les utiliser ?
Pour gérer des tâches transversales : authentification, permissions, logs, CORS... C'est la commande php artisan make:middleware qui lance la magie.
4. Les Facades : DRY ton accès aux services
Une Facade est une interface statique vers une classe dans le conteneur de services de Laravel. Elle permet d’accéder à des services sans avoir besoin de les instancier directement.
Elles simplifient le code, le rendent plus lisible et fluide. Laravel gère l'injection de dépendances pour vous.
5. Les Components Blade : DRY ton HTML
Un morceau de code HTML encapsulé dans une classe PHP. Il peut contenir du HTML, du Blade, et même de la logique PHP. Ils permettent de réutiliser facilement des éléments d'interface utilisateur.
Pourquoi les utiliser ?Pour ne pas dupliquer le HTML dans plusieurs vues. Une modification dans le composant se propage partout. C'est le top de l'encapsulation (logique + style en un seul endroit).
Le Component Master
Évite les doublons à tout prix.
Dans une équipe, pour éviter de recréer le même composant sous 10 variations :
- Lister tous les composants existants.
- Valider l'utilisation avant d'en créer un nouveau.
- Structurer intelligemment (Générique vs Spécifique).
Résultat : Maintenance simplifiée et gestion du code maîtrisée.
FAQ : Laravel DRY
dd() ou route()), tandis qu'une Facade est une interface statique donnant accès à un objet complexe du conteneur de services (comme Route::get()). Les Facades sont plus testables et orientées objet.
scope (ex: scopeActive), mais lors de l'appel, on omet ce préfixe (ex: User::active()). Utilisez des noms clairs et explicites qui décrivent le filtre appliqué.