Une façon différente d’organiser son application avec Laravel Actions

Publié le 4 juillet 2023 par Marc COLLET
Couverture de l'article Une façon différente d’organiser son application avec Laravel Actions

Le paquet laravel-actions permet de mettre en place une façon différente d'organiser la logique de vos applications Laravel en se concentrant sur les actions que vos applications fournissent.

Au lieu de créer des controllers, des jobs, des listeners, etc …, il vous offre la possibilité de créer une classe PHP qui gère une tâche spécifique et d'exécuter cette classe comme vous le souhaitez.

Installation

Comme pour tout paquet une simple commande composer fait l'installation :

1composer require lorisleiva/laravel-actions

Vous pouvez ensuite ajouter le trait AsAction à n'importe laquelle de vos classes pour en faire une action.

1use Lorisleiva\Actions\Concerns\AsAction;
2 
3class UpdateUserPassword
4{
5 use AsAction;
6 
7 public function handle(User $user, string $newPassword)
8 {
9 // ...
10 }
11}

Usage

De manière similaire à toute autre commande make de Laravel pour créer votre première action utilisez :

1php artisan make:action PublishANewArticle

Ensuite, définissez les méthodes asX lorsque vous souhaitez que votre action soit exécutée en tant que X. Par exemple, asController, asJob, asListener et/ou asCommand.

1class PublishANewArticle
2{
3 use AsAction;
4 
5 public function handle(User $author, string $title, string $body): Article
6 {
7 return $author->articles()->create([
8 'title' => $title,
9 'body' => $body,
10 ]);
11 }
12 
13 public function asController(Request $request): ArticleResource
14 {
15 $article = $this->handle(
16 $request->user(),
17 $request->get('title'),
18 $request->get('body'),
19 );
20 
21 return new ArticleResource($article);
22 }
23 
24 public function asListener(NewProductReleased $event): void
25 {
26 $this->handle(
27 $event->product->manager,
28 $event->product->name . ' Released!',
29 $event->product->description,
30 );
31 }
32}

As an object

Vous pouvez maintenant exécuter votre action en tant qu'objet en utilisant la méthode run comme suit :

1PublishANewArticle::run($author, 'My title', 'My content');

As a controller

Il suffit d'enregistrer votre action en tant que contrôleur invokable dans un fichier de routes.

1Route::post('articles', PublishANewArticle::class)->middleware('auth');

As a listener

Il y a juste à créer votre action en tant que listener de l'event NewProductReleased.

1Event::listen(NewProductReleased::class, PublishANewArticle::class);

Ensuite, la méthode asListener de votre action sera appelée chaque fois que l’event NewProductReleased sera déclenché.

1event(new NewProductReleased($manager, 'Product title', 'Product description'));

Pour aller plus loin

En plus d'exécuter vos actions en tant qu'objets, contrôleurs et listeners, Laravel Actions supporte également les jobs, les commandes et même le mocking de vos actions dans les tests.

Vous pouvez retrouver toutes les informations de ce paquet sur son dépôt Github.

Marc COLLET avatar
Marc COLLET
Développeur Freelance | Créateur de Solutions Numériques

A lire

Autres articles de la même catégorie