Votre contrôleur en fait trop

Ouvrez votre contrôleur. Regardez votre méthode store.

Contient-elle 40 lignes de code ? Commence-t-elle par un énorme bloc de validation, suivi de plusieurs instructions if, puis de la logique métier, et enfin d'un return ?

Votre contrôleur effectue un travail qui ne relève pas de sa responsabilité.

Un contrôleur a un rôle unique et simple. Il reçoit une requête, appelle un service pour résoudre le problème et renvoie une réponse. Voyez-le comme un serveur. Un serveur apporte votre plat. Il ne le cuisine pas.

Lorsque vous placez la validation, l'autorisation et le traitement des données à l'intérieur d'un contrôleur, cela devient un désordre. Vous vous retrouvez avec un monstre de 80 lignes que personne ne veut toucher.

Laravel propose une solution intégrée : les Form Requests.

Arrêtez de répéter la logique de validation et d'autorisation dans chaque méthode. Utilisez le principe de responsabilité unique (Single Responsibility Principle). Une classe ne doit avoir qu'une seule raison de changer. Un contrôleur change lorsque le flux de la requête change. Il ne devrait pas changer simplement parce qu'une règle de validation change.

Exécutez cette commande pour créer une classe de requête dédiée : php artisan make:request StorePostRequest

Déplacez votre logique dans cette nouvelle classe. Une Form Request gère trois choses principales :

• Autorisation : Utilisez la méthode authorize pour décider si un utilisateur peut effectuer une action. Si elle renvoie false, Laravel envoie automatiquement une erreur 403.

• Validation : Utilisez la méthode rules pour définir vos exigences de données.

• Préparation des données : Utilisez prepareForValidation pour nettoyer ou transformer les données avant l'exécution de la validation. C'est parfait pour générer des slugs ou normaliser des numéros de téléphone.

Une fois que vous avez déplacé cette logique, votre contrôleur rétrécit. Il pourrait ressembler à ceci :

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

C'est tout. Deux lignes.

Le contrôleur reste léger car Laravel exécute la validation et l'autorisation avant même que la méthode ne commence. Si les données sont incorrectes, l'utilisateur reçoit immédiatement une erreur.

Attention toutefois. N'utilisez pas les Form Requests pour tout. Si vous avez une petite route avec un seul champ simple, gardez la validation en ligne. Utilisez les Form Requests lorsque la logique s'étend, se répète ou implique des permissions.

De plus, ne mettez pas de logique métier dans une Form Request. Les calculs et les mises à jour de la base de données appartiennent à une couche Service (Service layer).

Trouvez votre contrôleur le plus désordonné aujourd'hui. Extrayez la validation dans une Form Request. Regardez-le rétrécir.

Quelle est la méthode store la plus volumineuse que vous ayez jamais vue ? Dites-le-moi dans les commentaires.

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o