首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Symfony 2:依赖注入和特征

Symfony 2:依赖注入和特征
EN

Stack Overflow用户
提问于 2012-07-14 02:28:27
回答 2查看 10.1K关注 0票数 15

我正在尝试找到一种在新的PHP5.4 traits中使用Symfony 2 Dependency Injection component的方法。

长话短说(实际上不是很短),我的项目解耦了View类,这些类都有自己的特定构造函数。每个视图可以使用零个或多个视图帮助器,它们被定义为特征:

代码语言:javascript
运行
复制
trait TranslatorHelper
{
    /**
     * @var Translator
     */
    protected $translator;

    /**
     * @param Translator $translator
     */
    protected function setTranslator(Translator $translator)
    {
        $this->translator = $translator;
    }

    /**
     * @param string $text
     * @return string
     */
    public function translate($text)
    {
        return $this->translator->translate($text);
    }
}

-

代码语言:javascript
运行
复制
class UserEditView extends AbstractView
{
    use TranslatorHelper;

    public function __construct(User $user, UserEditForm $form)
    {
        // ...
    }
}

我希望在我的控制器renderView()中有一个方法,在呈现视图之前,根据View类使用的所有特征执行setter注入:

代码语言:javascript
运行
复制
class Controller
{
    public function renderView(View $view)
    {
        // Check what traits are used by $view, and inject their dependencies
        // {...}


        // Then render the View
        return $view->render();
    }
}

关于如何使用DependencyInjection组件完成此任务,您有什么想法吗?

很明显,主要问题是视图不是由DI容器创建的,而是可以在应用程序流中的任何位置创建的。只有在呈现它们之前,才需要注入依赖项。

最后要注意的是:我并不依赖Symfony组件。另外一个DI容器上的任何lead也会受到欢迎。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-16 17:23:27

我认为特征不是用来以这种方式进行依赖注入的。在类似的场景中,我会做的是在视图类中使用构造函数注入(或者甚至setter也可以,如果可能的话,即使是强硬的构造函数也更好),它实现了特征来直接注入所需的服务。

如果您认为由类实现的特征是在应用程序执行之前静态定义的,那么您实际上不需要检查特征来执行动态注入。在运行之前,你就会知道你需要什么服务,只要把它们当做一些具体方法的接口来考虑就行了。

票数 6
EN

Stack Overflow用户

发布于 2018-05-18 21:40:21

Symfony 3.3引入了自动连接服务的概念。

您所要做的就是在您的特征中创建一个设置器函数,并添加@required注释。

代码语言:javascript
运行
复制
private $entityManager;

/**
 * @required
 * @param EntityManagerInterface $entityManager
 */
public function setEntityManager(EntityManagerInterface $entityManager)
{
    $this->entityManager = $entityManager;
}

参考:https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-e-g-setters

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11476222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档