是否有机会让控制器依赖于他们的服务,而不是通过使用其中的服务容器,而是通过纯构造函数依赖注入?
我想以这种方式编写控制器:
<?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
调用来执行控制器的新实例。
答案 0 :(得分:12)
事实上它绝对是推荐的,如果你看一下大多数第三方软件包,比如FOSUser,你就会发现这正是他们所做的。
诀窍是将控制器定义为服务,然后使用服务ID而不是类名。
http://symfony.com/doc/current/cookbook/controller/service.html
请记住,您必须注入所有必需的服务,例如实体管理器,您通常不会扩展symfony基类。当然,您可以注入完整的容器,但这往往会不受欢迎。