Patron de conception : La Couche Service avec Laravel

Initialement, le billet avait été écrit en Anglais, et je l’avais publié sur dotdev, mais certains voulaient la version Française. La voici.

service-layer

L’utilisation de la Couche Service est un patron de conception qui va vous permettre d’ajouter de l’abstraction sur la partie logique de votre application, quand vous utilisez plusieurs front-end sur votre application.
En fait, vous déléguez la logique applicative à un service commun (la couche Service). De ce fait, n’avez qu’une classe à maintenir quand votre application grossit, ou quand elle est mise à jour.
C’est aussi une bonne façon de nettoyer les controllers, et les rendre plus lisibles.

Ce qu’il faut comprendre c’est que vous allez vous éviter de dupliquer votre code, parce que vous allez pouvoir vous concentrer uniquement sur une seule classe Service, au lieu de mettre à jour tous les controllers concernés.
A noter que ce n’est pas quelque chose que vous devez impérativement utiliser pour votre prochaine application, mais juste une façon d’avoir un seul point d’entrée à maintenir, et une meilleure compréhension pour les développeurs qui vont vous rejoindre sur le projet.

Imaginez une application dans laquelle vous voulez offrir à vos utilisateurs, la possibilité de créer des coupons de réductions pour leurs clients :

Le controller API

Si vous ne séparez pas votre logique, vous pourrez tomber dans ce piège dans lequel vos controllers vont rapidement devenir obèse et illisible. Voici un exemple de ce qu’on pourrait faire :

public function store(CreateCoupon $request)
{
$validator = $this->validate($request->all(), [...]);

\App\Coupon::create([
'code' => $request->get('code'),
'amount' => $request->get('amount'),
'max_redemptions' => $request->get('max_redemptions')
]);

return redirect('coupons')->withSucces($message);
}

Maintenant, votre patron a besoin d’un programme de parrainage. Donc vous copiez/collez la fonction (sic), avec certains ajustements, que vous poussez en production. Et vous répétez ça encore et encore, jusqu’à ce que vous ayez besoin d’ajouter une colonne à votre table coupons : Maintenant il faut mettre à jour toutes les règles de validation, mettre à jour tous les endroits dans lesquels vous avez utilisez ce morceau de code, etc.

Rendre vos controllers plus lisibles, et plus maintenables.

La première chose à faire est d’extraire vos règles de validation dans une classe de validation. Ca ne fait pas parti de ce patron de conception, mais Laravel offre une très belle manière de le faire. Maintenant que vous avez créé votre classe pour gérer la requête, vous pouvez l’injecter via le paramètre $request.

La 2e partie consiste à créer la classe Service. Dans votre application Laravel, allez simplement dans le dossier app/Services, et vous créez une classe CreateCouponService, ou CreateCoupon si vous préférez, peu importe. Ajoutez une méthode make() et collez votre code pour créer la nouvelle entité :

public function make(CreateCoupon $request)
{
$coupon = \App\Coupon::create([
'code' => $request->get('code'),
'amount' => $request->get('amount'),
'max_redemptions' => $request->get('max_redemptions')
]);
return $coupon;
}

Maintenant, vous pouvez modifier votre controller, et injecter votre service via son constructeur. De cette manière, vous pourrez l’utiliser en tant que propriété.

Donc, la méthode de votre controller devrait ressembler à ça :

public function store(CreateCoupon $request)
{
$this->createCouponService->make($request);

return back()->with(['success' => 'Congratulations!']);
}

Imaginez si vous avez besoin de créer des coupons à différents endroits dans votre application, et que vous avez besoin de modifier la manière dont ils sont créés: Modifiez votre Service, et votre classe Request, et c’est tout !

metrogeek

Comments 1

Laisser un commentaire