Bonjour(soir), je me demandais s'il y avait moyen d'économiser les requêtes en passant un élément du middleware vers le controlleur.
Je m'explique :

imaginons une route /post/{post}

imaginons un modèle Post en relation belongsTo le modèle User

imaginons un middleware checkPost qui vérifie qu'il y ait un utilisateur connecté et que le {post} lui appartienne

imaginons le controlleur PostsController et la méthode show($id) qui affiche le {post}

Donc ma question est la suivante :

Il faudra faire une requête dans le middleware du type

$post = Post::find($request->route()->parameters()['post']);

De même dans la méthode show du controlleur

$post = Post::find($id);

Qui revient à la même chose, au final. Donc est-ce qu'il y aurait une manière de passer le $post trouvé dans le middleware au controlleur, pour économiser une requête.

Merci d'avance si quelqu'un prend le temps de m'aider ^_^

2 réponses


Grafikart
Réponse acceptée

Non, le middleware étant appellé avant le controller tu es foutu :)
MAIS il y a une solution, je la décris dans ce chapitre là (pour le middleware Owner) : http://www.grafikart.fr/formations/laravel/tp2-pets

Pour te résumer l'idée :

  • Le middleware à accès à request et va donc récupérer le post et vérifier si il correspond à ton critère
  • Le middleware va ensuite altérer la requête et modifier le paramètre pour ne pas renvoyer l'id mais plutôt l'entité. $request->route()->setParameter('id', );
  • Le controller se retrouve donc avec une instance de l'entité en paramètre et peut continuer à travailler dessus.
AlexJM
Auteur

Merci de la réponse, tout à fait ce que je voulais :)