【问题标题】:Symfony 2: Dependency injection (DI) of ControllersSymfony 2:控制器的依赖注入(DI)
【发布时间】:2012-04-23 18:33:22
【问题描述】:

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

我想这样写控制器:

<?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 调用来创建新的控制器实例。

【问题讨论】:

    标签: model-view-controller symfony dependency-injection fosuserbundle


    【解决方案1】:

    事实上,这是推荐的,如果您查看大多数 3rd 方捆绑包,例如 FOSUser,您会发现这正是他们所做的。

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

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

    请记住,您必须注入所有需要的服务,例如实体管理器,并且通常不会扩展 symfony 基类。当然,您可以注入完整的容器,但这往往会令人不悦。

    【讨论】:

    • 看看我的AbstractControllerBundle。它旨在为您提供parent service 以简化将控制器用作服务。
    • 在我看来,FOSUser 不会这样做吗?我错过了重点吗? Václav 的问题是关于通过构造方法注入它们,而 FOSUser 执行 $this->container->get('service'); github.com/FriendsOfSymfony/FOSUserBundle/blob/master/…
    • 实际上是推荐的 - 根据official documentation:“Symfony 并未正式推荐将控制器定义为服务”
    • @rybo111 确实如此,但当我 5 多年前写这个答案时,Symfony 最佳实践文档并不存在。如果你看看依赖注入与服务定位器的争论,那么依赖注入通常会胜出。但今天有趣和相关的是 Symfony 4 默认将控制器定义为服务。车轮转动。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 2016-02-01
    • 1970-01-01
    • 2014-11-15
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多