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.