Cómo definir controladores como servicios

En el libro, has aprendido lo fácilmente que puedes utilizar un controlador cuando extiende la clase base Symfony\Bundle\FrameworkBundle\Controller\Controller. Si bien esto funciona estupendamente, los controladores también se pueden especificar como servicios.

Para referir un controlador que se defina como servicio, utiliza la notación de dos puntos individuales (:). Por ejemplo, supongamos que has definido un servicio llamado my_controller y —dentro del servicio— lo quieres redirigir a un método llamado indexAction():

$this->forward('my_controller:indexAction', array('foo' => $bar));

Necesitas usar la misma notación para definir el valor _controller de la ruta:

my_controller:
    path:   /
    defaults:  { _controller: my_controller:indexAction }

Para utilizar un controlador de esta manera, este se debe definir en la configuración del contenedor de servicios. Para más información, consulta el capítulo Contenedor de servicios.

Cuando se utiliza un controlador definido como servicio, lo más probable es no ampliar la clase base Controller. En lugar de confiar en sus métodos de acceso directo, debes interactuar directamente con los servicios que necesitas. Afortunadamente, esto suele ser bastante fácil y la clase base Controller en sí es una gran fuente sobre la manera de realizar muchas tareas comunes.

Nota

Especificar un controlador como servicio requiere un poco más de trabajo. La principal ventaja es que el controlador completo o cualquier otro servicio pasado al controlador se puede modificar a través de la configuración del contenedor de servicios. Esto es útil especialmente cuando desarrollas un paquete de código abierto o cualquier paquete que se pueda utilizar en muchos proyectos diferentes. Así que, aunque no especifiques los controladores como servicios, es probable que veas hacer esto en algunos paquetes de código abierto de Symfony2.

Utilizando anotaciones en enrutado

Cuándo utilizas anotaciones para configurar el enrutado al utilizar un controlador definido como servicio, es necesario especificar tu servicio de la siguiente manera:

/**
 * @Route("/blog", service="my_bundle.annot_controller")
 * @Cache(expires="tomorrow")
 */
class AnnotController extends Controller
{
}

En este ejemplo, my_bundle.annot_controller tendría que ser el id de la instancia de AnnotController definida en el contenedor del servicio. Esto está documentado en el capítulo @Route y @Method.

Bifúrcame en GitHub