X

Déplacer le code du contrôleur vers… Où ?


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 StoreUserRequestet 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…