L’une des questions les plus courantes que je vois à propos de Laravel est de savoir comment structurer le projet. Ou, en d’autres termes, où mettre la logique hors des contrôleurs ? Dans cet article, je vais essayer de montrer les options, en essayant de raccourcir une méthode de contrôleur à titre d’exemple.
Ceci est un tutoriel sous forme de texte basé sur la section de mon cours vidéo Comment structurer des projets Laravel
Nous verrons comment déplacer la logique du contrôleur vers… :
- Demandes de formulaire
- Mutateurs éloquents
- Observateurs éloquents
- Catégories de services
- Classes d’actions
- Emplois
- Événements et auditeurs
- Aides globales
- Caractéristiques
- Contrôleurs de base
- Classes de référentiel
Beaucoup à couvrir, hein ? Alors, commençons.
Code de contrôleur initial
Avant de commencer à nettoyer le Controller, voici le code que nous allons essayer de raccourcir :
1public function store(Request $request)
2{
3 $this->authorize('user_create');
4
5 $userData = $request->validate([
6 'name' => 'required',
7 'email' => 'required|unique:users',
8 'password' => 'required',
9 ]);
10
11 $userData['start_at'] = Carbon::createFromFormat('m/d/Y', $request->start_at)->format('Y-m-d');
12 $userData['password'] = bcrypt($request->password);
13
14 $user = User::create($userData);
15 $user->roles()->sync($request->input('roles', []));
16
17 Project::create([
18 'user_id' => $user->id,
19 'name' => 'Demo project 1',
20 ]);
21 Category::create([
22 'user_id' => $user->id,
23 'name' => 'Demo category 1',
24 ]);
25 Category::create([
26 'user_id' => $user->id,
27 'name' => 'Demo category 2',
28 ]);
29
30 MonthlyRepost::where('month', now()->format('Y-m'))->increment('users_count');
31 $user->sendEmailVerificationNotification();
32
33 $admins = User::where('is_admin', 1)->get();
34 Notification::send($admins, new AdminNewUserNotification($user));
35
36 return response()->json([
37 'result' => 'success',
38 'data' => $user,
39 ], 200);
40}
Une grosse méthode, non ? Passons maintenant en revue les options pour le raccourcir.
Avis: en fin de compte, c’est votre préférence personnelle où déplacer le code, vous POUVEZ choisir n’importe quelle option listée ci-dessous.
Validation de la demande de formulaire
Nous allons commencer par extraire la validation dans Form Request. Dans cet exemple, la validation est simple, avec trois champs, mais dans la vraie vie, vous pourriez avoir plus de 10 champs.
En fait, nous avons deux parties de la validation :
- autorisations
- validation des données d’entrée
Les deux PEUVENT être déplacés vers la classe Form Request.
Commençons par créer une demande de formulaire :
1php artisan make:request StoreUserRequest
Maintenant nous avons le app\Http\Requests\StoreUserRequest.php
fichier qui contient deux méthodes : authorize()
pour les autorisations et rules()
pour la validation des données. Ainsi, la demande de formulaire ressemblerait à ceci :
app\Http\Requests\StoreUserRequest.php:
1class StoreUserRequest extends FormRequest
2{
3 public function authorize()
4 {
5 return Gate::allows('user_create');
6 }
7
8 public function rules()
9 {
10 return [
11 'name' => 'required',
12 'email' => 'required|unique:users',
13 'password' => 'required',
14 ];
15 }
16}
Dans le contrôleur, au lieu de la valeur par défaut Request
classe, nous devons injecter notre StoreUserRequest
et les données validées sont accessibles à l’aide de la validated()
méthode de la requête. Maintenant, le contrôleur ressemblera à ceci :
1public function store(StoreUserRequest $request)
2{
3 $userData = $request->validated();
4
5 $userData['start_at'] = Carbon::createFromFormat('m/d/Y', $request->start_at)->format('Y-m-d');
6 $userData['password'] = bcrypt($request->password);
7
8 $user = User::create($userData);
9 $user->roles()->sync($request->input('roles', []));
10 //
11}
Quelques premières lignes du Contrôleur raccourcies. Allons-nous en.
Changement de données pour les mutateurs ou les observateurs
Supposons que vous souhaitiez transformer certaines données avant de les enregistrer dans la base de données.
Deux exemples ici formatant la date et cryptant le mot de passe.
Maintenant, nous le faisons dans le contrôleur, mais utilisons les fonctionnalités de Laravel Eloquent pour cela. Je vais vous montrer deux méthodes, l’une utilisant des mutateurs et l’autre utilisant des observateurs.
Mutateurs
Dans les modèles Eloquent, vous pouvez…