Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github
No livro, você aprendeu como um controlador pode ser facilmente usado quando ele
estende a classe base
Controller
. Mesmo
isso funcionando bem, os controladores também podem ser especificados como serviços.
Para referir-se a um controlador que é definido como um serviço, utilize a notação de um único dois pontos (:)
. Por exemplo, supondo que você definiu um serviço chamado
my_controller
e que deseja encaminhar para um método chamado indexAction()
dentro do serviço:
$this->forward('my_controller:indexAction', array('foo' => $bar));
Você precisa usar a mesma notação ao definir o valor da rota
_controller
:
1 2 3 | my_controller:
pattern: /
defaults: { _controller: my_controller:indexAction }
|
Para utilizar um controlador desta forma, ele deve estar definido na configuração do container de serviço. Para mais informações, consulte o capítulo Service Container
Ao usar um controlador definido como um serviço, ele provavelmente não estenderá
a classe base Controller
. Em vez de contar com seus métodos de atalho,
você vai interagir diretamente com os serviços que você precisa. Felizmente, isto é
normalmente muito fácil e a classe base Controller
em si é uma grande fonte
sobre a forma de realizar muitas das tarefas comuns.
Note
Especificar um controlador como um serviço leva um pouco mais de trabalho. A principal vantagem é que todo o controlador ou quaisquer serviços passados para o controlador podem ser modificados através da configuração do container de serviço. Isto é especialmente útil no desenvolvimento de um bundle open-source ou qualquer bundle que será utilizado em vários projetos diferentes. Assim, mesmo se você não especificar os seus controladores como serviços, provavelmente verá isto feito em alguns bundles open-source do Symfony2.
Ao usar anotações para configurar as rotas em um controlador definido como um serviço, é necessário especificar o serviço da seguinte forma:
/**
* @Route("/blog", service="my_bundle.annot_controller")
* @Cache(expires="tomorrow")
*/
class AnnotController extends Controller
{
}
Neste exemplo, my_bundle.annot_controller
deve ser o id da
instância AnnotController
definida no container de serviço. Isto está
documentado no capítulo /bundles/SensioFrameworkExtraBundle/annotations/routing
.