PHPackages                             andydefer/laravel-actions - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. andydefer/laravel-actions

ActiveLibrary[Framework](/categories/framework)

andydefer/laravel-actions
=========================

Action-oriented architecture for Laravel applications

2.1.1(1w ago)09↓100%MITPHPPHP &gt;=8.1

Since May 25Pushed 6d agoCompare

[ Source](https://github.com/andydefer/laravel-actions)[ Packagist](https://packagist.org/packages/andydefer/laravel-actions)[ RSS](/packages/andydefer-laravel-actions/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (8)Versions (7)Used By (0)

Laravel Actions
===============

[](#laravel-actions)

[![Latest Version on Packagist](https://camo.githubusercontent.com/32e05a758f3e81e6fb7d972d642730df6b6d708f3a7258159f0c72e1334b6ddd/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616e647964656665722f6c61726176656c2d616374696f6e732e737667)](https://packagist.org/packages/andydefer/laravel-actions)[![PHP Version Require](https://camo.githubusercontent.com/83bd61eea80d0f356fd340c9ee2c23e8728077c6eb1926a3c96c937f0001575a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f616e647964656665722f6c61726176656c2d616374696f6e732e737667)](https://packagist.org/packages/andydefer/laravel-actions)[![Laravel Version](https://camo.githubusercontent.com/05834abe77b280432d35cc7fc139638cb2f7457bed1ef5db1547d3ae475787fa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d3130253246313125324631322d6666326432302e737667)](https://laravel.com)[![License](https://camo.githubusercontent.com/2ab379ea14f0921de44007a04b48d64dc561f9ba9f15b6ecb5b799748c12e58f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f616e647964656665722f6c61726176656c2d616374696f6e732e737667)](https://packagist.org/packages/andydefer/laravel-actions)

Table des matières
------------------

[](#table-des-matières)

- [Introduction](#introduction)
- [Philosophie](#philosophie)
- [Installation](#installation)
- [Concepts clés](#concepts-cl%C3%A9s)
- [Guide de démarrage](#guide-de-d%C3%A9marrage)
- [Documentation détaillée](#documentation-d%C3%A9taill%C3%A9e)
- [Tests](#tests)
- [Compatibilité](#compatibilit%C3%A9)
- [License](#license)

---

Introduction
------------

[](#introduction)

**Laravel Actions** est un package qui implémente le pattern **ADR (Action-Domain-Responder)** pour Laravel. Il transforme vos contrôleurs en classes d'action simples, testables et maintenables.

Chaque route HTTP est associée à une **Action** (logique métier) et une **Request** (validation et transformation des données).

```
// Au lieu d'un contrôleur avec 5 méthodes
class UserController extends Controller
{
    public function index() { ... }
    public function show($id) { ... }
    public function store(Request $request) { ... }
    // ...
}

// Vous avez 5 classes d'action dédiées
final class ListUsersAction extends AbstractAction { ... }
final class ShowUserAction extends AbstractAction { ... }
final class CreateUserAction extends AbstractAction { ... }
```

---

Philosophie
-----------

[](#philosophie)

PrincipeApplication dans le package**Single Responsibility**Une Action = une route HTTP**Type Safety**Records typés entre Request et Action**Testabilité**Actions sans helpers globaux, seulement des dépendances injectées**Immutabilité**Records et Data DTOs sont readonly**Template Method**Cycle de vie `before()` → `handle()` → `after()`---

Installation
------------

[](#installation)

```
composer require andydefer/laravel-actions
```

Le package s'enregistre automatiquement via Laravel's auto-discovery.

---

Concepts clés
-------------

[](#concepts-clés)

### 1. AbstractAction

[](#1-abstractaction)

Classe de base pour toutes vos actions. Implémente le pattern **Template Method**.

```
final class CreateUserAction extends AbstractAction
{
    public function __construct(
        private readonly UserRepositoryInterface $users
    ) {}

    protected function handle(AbstractRecord $request): ResponseFactory
    {
        $user = $this->users->create($request->toArray());
        return ResponseFactory::json(UserData::from($user), 201);
    }
}
```

**Cycle de vie :**

```
run(Record) → before() → handle() → after() → ResponseFactory

```

### 2. AbstractRequest

[](#2-abstractrequest)

Classe de base pour vos requêtes. Étend `FormRequest` de Laravel.

```
final class CreateUserRequest extends AbstractRequest
{
    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'email', 'unique:users'],
        ];
    }

    public function getRecord(): AbstractRecord
    {
        return CreateUserRecord::from([
            'name' => $this->input('name'),
            'email' => $this->input('email'),
        ]);
    }
}
```

### 3. AbstractRecord

[](#3-abstractrecord)

DTO typé pour transporter les données entre la Request et l'Action.

```
final class CreateUserRecord extends AbstractRecord
{
    public function __construct(
        public readonly string $name,
        public readonly string $email,
    ) {}
}
```

### 4. AbstractData

[](#4-abstractdata)

DTO immutable pour les réponses HTTP (converti automatiquement en camelCase).

```
final class UserData extends AbstractData
{
    public function __construct(
        public readonly string $id,
        public readonly string $name,
        public readonly string $email,
    ) {}
}
```

### 5. ResponseFactory

[](#5-responsefactory)

Factory pour construire des réponses HTTP de manière déclarative.

```
return ResponseFactory::json($userData);           // JSON API
return ResponseFactory::inertia('Dashboard/Index'); // Inertia SPA
return ResponseFactory::redirectRoute('home');     // Redirection
return ResponseFactory::noContent();               // 204 No Content
return ResponseFactory::fileDownload($path);       // Téléchargement
```

### 6. ActionRoute

[](#6-actionroute)

Enregistrement simplifié des routes.

```
ActionRoute::get('/api/users', ListUsersRequest::class, ListUsersAction::class);
ActionRoute::post('/api/users', CreateUserRequest::class, CreateUserAction::class);
ActionRoute::get('/api/users/{id}', ShowUserRequest::class, ShowUserAction::class);
ActionRoute::put('/api/users/{id}', UpdateUserRequest::class, UpdateUserAction::class);
ActionRoute::delete('/api/users/{id}', DeleteUserRequest::class, DeleteUserAction::class);
```

---

Guide de démarrage
------------------

[](#guide-de-démarrage)

### Étape 1 : Créer un Record

[](#étape-1--créer-un-record)

```
// app/Records/ShowUserRecord.php
