Symfony 2:控制器的依赖注入(DI)

Vác*_*tný 13 model-view-controller dependency-injection symfony fosuserbundle

有没有机会让控制器依赖于他们的服务,而不是通过使用其中的服务容器,而是通过纯构造函数依赖注入?

我想以这种方式编写控制器:

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

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我可以看到Symfony ControllerResolver不是通过ServiceContainer而是通过简单的return new $controller调用来完成控制器的新实例.

Cer*_*rad 12

事实上它绝对是推荐的,如果你看看大多数第三方软件包,比如FOSUser,你可以看到这正是他们所做的.

诀窍是将控制器定义为服务,然后使用服务ID而不是类名.

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

请记住,您必须注入所有必需的服务,例如实体管理器,您通常不会扩展symfony基类.当然你可以注入完整的容器,但这往往是皱眉头.

  • 它不像FOSUser那样对我这样做吗?我错过了这一点吗?Václav的问题是关于通过构造函数方法注入它们,而FOSUser执行$ this-> container-> get('service'); https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/RegistrationController.php (9认同)