Récupérer des objets Doctrine avant même le contrôleur
Sur la page d'affichage d'un article de blog, par exemple, n'êtes-vous pas fatigué de toujours devoir vérifier l'existence de l'article demandé et de l'instancier vous-même ? N'avez-vous pas l'impression d'écrire toujours et encore les mêmes lignes ?
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
public function voirwAction($id)
{
if( ! $article = $this->get('doctrine')->getEntityManager()->getRepository('Sdz\BlogBundle\Entity\Article')->find($id) )
{
throw new NotFoundHttpException(sprintf('L\'article id:"%s" n\'existe pas.', $id));
}
// votre vrai code
return $this->render('SdzBlogBundle:Blog:voir.html.twig', array('article' => $article));
}
|
Pour enfin vous concentrer sur votre code métier, Symfony a évidemment tout prévu !
Les ParamConverters
Vous pouvez créer ou utiliser des
ParamConverters qui vont agir juste après le routeur. Les
ParamConverters vont, comme leur nom l'indique,
convertir les paramètres de votre route au format que vous préférez.
En effet, depuis la route, vous ne pouvez pas tellement agir sur vos paramètres. Tout au plus, vous pouvez leur imposer des contraintes
via une
regex. Les
ParamConverter pallient cette limitation en agissant après le routeur.
Un ParamConverter utile : DoctrineParamConverter
Vous l'aurez deviné, ce
ParamConverter va nous convertir nos paramètres directement en
Entity Doctrine !
- L'idée : dans le contrôleur, à la place de la variable <?php $id, on souhaite récupérer directement une variable <?php $article qui correspond à l'article portant l'id <?php $id.
- Le bonus : on veut également que, si l'article portant l'id <?php $id n'existe pas, une exception 404 soit levée. Après tout, c'est comme si l'on mettait dans la route : "requirements: Article exists" !
Un peu de théorie sur les ParamConverter
Comment fonctionne un
ParamConverter ?
Ce n'est en fait qu'un simple
listener qui écoute l'évènement
kernel.controller. Cet évènement est déclenché lorsque le contrôleur sait quel contrôleur appeler (après le routeur, donc), mais avant d'exécuter effectivement le contrôleur. Ainsi, lors de cet évènement, le
ParamConverter va lire la méthode de votre contrôleur pour trouver soit l'annotation, soit le type de variable que vous souhaitez. Fort de ces informations, il va se permettre de modifier le paramètre de la requête (il y a accès). Ainsi, depuis votre contrôleur, vous n'avez plus le paramètre original tel que défini dans la route, mais un paramètre modifié par votre
ParamConverter qui s'est exécuté avant votre contrôleur.