DRY or Die

Don't Repeat Yourself

dry
Philippe Escalle CTO

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.

Comment les utiliser ?

Un local scope est une méthode ajoutée à ton modèle dont le nom commence par scope. Une fois défini, le scope est appelé sur une requête Eloquent comme une méthode fluide.

Les scopes sont géniaux parce qu’ils améliorent la lisibilité du code en évitant les répétitions dans les contrôleurs. Ils facilitent aussi la maintenance, car une seule modification dans le scope met à jour toutes les requêtes qui l’utilisent. Enfin, ils réduisent les erreurs en limitant le copier-coller.

Model >  class User extends Model { public function scopeAdmin($query) { return $query->where('role', 1); } }
Controler > $admins = User::admin()->get();


2. Les Traits et Services : Arrête de maltraiter ton code

Qu'est-ce qu'un Trait ?

Un trait est un mécanisme en PHP permettant de regrouper des méthodes réutilisables dans une classe. Les traits sont utilisés pour partager des fonctionnalités entre plusieurs classes sans avoir recours à l'héritage multiple, qui n'est pas supporté par PHP.

Dans Laravel, les traits permettent d'ajouter des méthodes communes à plusieurs modèles ou contrôleurs sans avoir besoin de dupliquer le code.

Qu'est-ce qu'un Service ?

Un service 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.

Quand utiliser un Trait et quand préférer un Service ?

Les traits sont utiles pour partager des comportements communs entre plusieurs modèles, comme la gestion des logs ou des notifications. Ils permettent d’éviter d’avoir des méthodes identiques dans plusieurs classes. Cependant, si un trait commence à regrouper trop de fonctionnalités différentes, il est préférable de créer un service. Un service est idéal lorsqu’une logique métier mérite une classe dédiée pour être testée et réutilisée proprement. Il permet aussi de séparer les responsabilités et de rendre le code plus modulaire.

En résumé, les traits sont parfaits pour des fonctionnalités simples et réutilisables, tandis que les services permettent de structurer et centraliser la logique métier importante.


3. Les Middlewares : DRY tes vérifications globales

Qu'est-ce qu'un Middleware ?

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. Il peut également s'exécuter après que la réponse a été préparée, mais avant qu'elle ne soit envoyée au client.

Pourquoi utiliser des Middlewares ?

Les middlewares sont utilisés pour gérer des tâches transversales comme l’authentification des utilisateurs, la vérification des permissions d’accès aux ressources, la journalisation des requêtes, la gestion des politiques de sécurité pour les requêtes cross-origin (CORS) et la modification des requêtes ou des réponses, notamment en ajoutant ou en modifiant des en-têtes et des données.

Comment les utiliser ?

Créer un middleware se fait avec la commande php artisan make:middleware NomDuMiddleware. Ensuite, il faut définir la logique de filtrage dans la classe générée et l’associer aux routes concernées.

On peut comparer un middleware à un videur de boîte de nuit : il contrôle qui entre et qui reste dehors !


4. Les Facades : DRY ton accès aux services

Qu'est-ce qu'une Facade ?

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.

Pourquoi utiliser les Facades ?

Les facades simplifient le code, car elles permettent d’appeler des méthodes statiques sans instancier un service. Elles rendent également le code plus lisible et fluide. Laravel se charge de l’injection et de la résolution des dépendances, ce qui fait gagner un temps précieux aux développeurs.


5. Les Components Blade : DRY ton HTML

Qu'est-ce qu'un Composant Blade ?

Un composant Blade est un morceau de code HTML encapsulé dans une classe PHP. Il peut contenir du HTML, du Blade (le moteur de template de Laravel), et même de la logique PHP. Les composants Blade permettent de réutiliser facilement des éléments d'interface utilisateur dans différentes parties de ton application.

Pourquoi utiliser des Components Blade ?

Les composants Blade permettent de réutiliser du code HTML sans le dupliquer dans plusieurs vues. Grâce à eux, les modifications apportées à un composant se propagent automatiquement partout où il est utilisé. Ils permettent aussi une meilleure encapsulation, en regroupant la logique et le style de chaque composant dans un seul fichier.

Le Component Master : Évite les doublons

Dans une équipe de développement, il arrive souvent que le même composant soit recréé sous différentes variations. Pour éviter cela, il est essentiel de centraliser les composants. Il faut d’abord lister tous les composants existants, puis valider leur utilisation avant d’en créer un nouveau. Enfin, il est important de structurer intelligemment les composants en distinguant ceux qui sont génériques de ceux qui sont spécifiques.

L’organisation des composants garantit une maintenance simplifiée et une meilleure gestion du code.

L'oeil du CTO

" Adopter une approche DRY (Don't Repeat Yourself) dans un projet Laravel va au-delà d'une simple décision technique ; c'est une stratégie d'optimisation globale visant à assurer la scalabilité, la maintenabilité et la durabilité du produit. Pour un CTO, cela se traduit par une équipe plus performante, un code plus stable et une meilleure capacité à répondre aux besoins métiers tout en évitant l'accumulation de dette technique. "