Buenas prácticas oficiales de Symfony

5.4. Utilizando los ParamConverter

Si en tu aplicación utilizas Doctrine, entonces puedes utilizar si quieres lo que se llama ParamConverter para realizar búsquedas en la base de datos automáticamente y pasar el resultado al controlador.

Buena Práctica Utiliza los ParamConverter para buscar las entidades Doctrine automáticamente siempre que la búsqueda sea sencilla.

Ejemplo

/**
 * @Route("/{id}", name="admin_post_show")
 */
public function showAction(Post $post)
{
    $deleteForm = $this->createDeleteForm($post);

    return $this->render('admin/post/show.html.twig', array(
        'post'      => $post,
        'delete_form' => $deleteForm->createView(),
    ));
}

Lo habitual en este tipo de controladores consiste en pasar como parámetro a showAction() el $id del artículo que se quiere leer. Sin embargo, al utilizar como parámetro la variable $post con el tipo de dato Post (en inglés a esta técnica se le llama type hinting), Symfony aplica un ParamConverter para buscar automáticamente el objeto cuyo atributo id coincida con el valor $id obtenido mediante la ruta. Si no se encuentra ningún objeto, se muestra automáticamente una página de error 404.

5.4.1. Realizando búsquedas más avanzadas

El ejemplo anterior funciona sin tener que realizar ninguna configuración adicional porque {id} coincide exactamente con el nombre de una entidad. Cuando esto no sucede, o si quieres hacer búsquedas más complejas, puede resultar más sencillo realizar la búsqueda de Doctrine a mano. Esto es por ejemplo lo que sucede en la clase CommentController de la aplicación:

/**
 * @Route("/comment/{postSlug}/new", name = "comment_new")
 */
public function newAction(Request $request, $postSlug)
{
    $post = $this->getDoctrine()
        ->getRepository('AppBundle:Post')
        ->findOneBy(array('slug' => $slug));

    if (!$post) {
        throw $this->createNotFoundException();
    }

    // ...
}

Por supuesto también podrías utilizar la configuración avanzada de @ParamConverter porque es bastante flexible:

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/**
 * @Route("/comment/{postSlug}/new", name = "comment_new")
 * @ParamConverter("post", options={"mapping": {"postSlug": "slug"}})
 */
public function newAction(Request $request, Post $post)
{
    // ...
}

La conclusión es que los ParamConverter son geniales para casos sencillos, pero no deberías olvidar que hacer las consultas Doctrine a mano también es bastante sencillo.