13

¿Hay alguna posibilidad de hacer que los controladores dependan de sus servicios no mediante el uso del contenedor de servicio dentro de ellos sino mediante la inyección de dependencia pura del constructor?Symfony 2: inyección de dependencia (DI) de los controladores

me gustaría escribir controladores de esta manera:

<?php 

class ArticleController extends \Symfony\Bundle\FrameworkBundle\Controller\Controller 
{ 
    private $articleFacade; 
    private $articleRepository; 

    public function __construct(ArticleFacade $articleFacade, ArticleRepository $articleRepository) 
    { 
     $this->articleFacade = $articleFacade; 
     $this->articleRepository = $articleRepository; 
    } 

    public function indexAction() 
    { 
     ... 
    } 

} 

Desafortunadamente lo que puedo ver Symfony ControllerResolver hace nuevas instancias de los controladores no a través de ServiceContainer sino a través de simples return new $controller llamada.

Respuesta

12

Absolutamente, de hecho, es recomendable, y si nos fijamos en la mayoría de los paquetes de terceros, como FOSUser, puede ver que eso es exactamente lo que hacen.

El truco consiste en definir sus controladores como servicios y luego usar la identificación del servicio en lugar del nombre de la clase.

http://symfony.com/doc/current/cookbook/controller/service.html

Tenga en cuenta que va a tener que inyectar todos los servicios necesarios, tales como gestores de entidad y no se suelen extender la clase base de Symfony. Por supuesto, puede inyectar el contenedor completo, pero eso tiende a ser desaprobado.

+0

Gracias por su respuesta. –

+1

Eche un vistazo a mi [AbstractControllerBundle] (https://github.com/elnur/ElnurAbstractControllerBundle). Está destinado a proporcionarle un [servicio principal] (http://symfony.com/doc/current/cookbook/service_container/parentservices.html) para simplificar el uso de controladores como servicios. –

+9

No me parece que FOSUser haga esto? ¿Me estoy perdiendo el punto? La pregunta de Václav fue acerca de inyectarlos a través del método constructor, mientras que FOSUser hace $ this-> container-> get ('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve

Cuestiones relacionadas