Utiliser plusieurs id d'entité dans les routes sans ajouter de ParamConverter

Utiliser plusieurs id d'entité dans les routes sans ajouter de ParamConverter

Le cas simple

Symfony permet, grâce aux ParamConverter, de convertir automatiquement un paramètre d'url en une autre valeur. Ce quelque chose que j'utilise beaucoup pour récupérer mes entité grâce au DoctrineParamConverter. Par défaut ce converter va associer le paramètre id d'une route avec l'entité passé en paramètre de l'action.

Par exemple grâce au DoctrineParamConverter, le paramètre id de cette route sera converti en l'entité Foo correspondante dans cette action :

/**
 * @Route("/foobar/{id}")
 */
class DemoController extends Controller
{
    public function foobarAction(Foo $foo)
    {
         return new Response();
    }
}

Deux entités

Disons maintenant que je souhaite avoir deux entités en paramètre de mon controller, je serai obligé d'utiliser un autre nom pour mon second id.

Pour la première entité, le DoctrineParamConverter s'en charge, pour la deuxième, comme l'indique la documentation de Symfony, je serai obligé de déclarer explicitement un ParamConverter sur mon action afin d'indiquer le paramètre à utiliser :

/**
 * @Route("/foo/{id}/bar/{bar_id}")
 * @ParamConverter("bar", class="AcmeBundle:Bar", options={"id" = "bar_id"})
 */
class DemoController extends Controller
{
    public function foobarAction(Foo $foo, Bar $bar)
    {
         return new Response();
    }
}

Astuce

Et bien sachez qu'il y a une autre solution. En donnant les mêmes noms aux paramètres id dans la route et aux paramètres de l'action, le DoctrineParamConverter convertit les id en entité sans configuration supplémentaire.

/**
 * @Route("/foo/{foo}/bar/{bar}")
 */
class DemoController extends Controller
{
    public function foobarAction(Foo $foo, Bar $bar)
    {
         return new Response();
    }
}

Les commentaires