13

有沒有機會讓控制器依賴於它們的服務而不是通過使用它們內部的服務容器,而是通過純粹的構造函數依賴注入?Symfony 2:控制器的依賴注入(DI)

我想編寫這樣的控制器:

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

} 

可惜的是,我可以看到Symfony的ControllerResolver確實控制器的新實例不是通過的ServiceContainer但通過簡單的return new $controller電話。

回答

12

絕對事實上,它是建議的,如果你看看大多數第三方軟件包,如FOSUser,你可以看到,這正是他們所做的。

訣竅是將您的控制器定義爲服務,然後使用服務ID而不是類名稱。

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

請記住,你將不得不以注入所有需要的服務,如實體管理器,你通常不會延長symfony的基類。當然,你可以注射完整的容器,但往往會皺起眉頭。

+0

謝謝你的回答。 – 2012-04-11 13:50:44

+1

看看我的[AbstractControllerBundle](https://github.com/elnur/ElnurAbstractControllerBundle)。它旨在爲您提供[母服務](http://symfony.com/doc/current/cookbook/service_container/parentservices.html)以簡化將控制器用作服務。 – 2012-04-11 14:10:46

+9

它在我看來不像FOSUser這樣做?我錯過了這一點嗎? Václav的問題是關於通過構造函數方法注入它們,而FOSUser做$ this-> container-> get('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php – Steve 2012-07-02 15:14:03