13

Esiste la possibilità di rendere i controllori dipendenti dai loro servizi non tramite l'utilizzo di un contenitore di servizi al loro interno, ma mediante un'iniezione di dipendenza pura del costruttore?Symfony 2: Iniezione di dipendenza (DI) dei controllori

vorrei scrivere controller in questo modo:

<?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() 
    { 
     ... 
    } 

} 

Purtroppo posso vedere Symfony ControllerResolver fa nuove istanze di controllori non tramite ServiceContainer ma via semplice return new $controller chiamata.

risposta

12

Assolutamente, infatti, è consigliato e se si guarda alla maggior parte dei pacchetti di terze parti come FOSUser si può vedere che è esattamente quello che fanno.

Il trucco è definire i controller come servizi e quindi utilizzare l'id del servizio anziché il nome della classe.

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

Tenete a mente che si dovrà iniettare tutti i servizi necessari, quali gestori di entità e non sarà di solito estendere la classe base di symfony. Naturalmente si potrebbe iniettare il contenitore completo, ma questo tende ad essere disapprovato.

+0

Grazie per la risposta. –

+1

Dai un'occhiata al mio [AbstractControllerBundle] (https://github.com/elnur/ElnurAbstractControllerBundle). Ha lo scopo di fornire un [servizio parent] (http://symfony.com/doc/current/cookbook/service_container/parentservices.html) per semplificare l'utilizzo dei controller come servizi. –

+9

Non mi sembra che FOSUser lo faccia? Mi manca il punto? La domanda di Václav consisteva nell'iniezione tramite il metodo del costruttore, mentre FOSUser fa $ this-> container-> get ('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve