php - 交响乐2 : dependency injection and traits

标签 php symfony dependency-injection

我正在尝试找到一种使用 Symfony 2 Dependency Injection component 的方法使用新的 PHP 5.4 traits .

长话短说(实际上没那么短),我的项目解耦了 View 类,这些类都有自己的特定构造函数。每个 View 可以使用零个或多个 View 助手,这些 View 助手被定义为特征:

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);
    }
}

-

class UserEditView extends AbstractView
{
    use TranslatorHelper;

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

我希望在我的 Controller 中有一个方法,renderView(),它在渲染 View 之前根据 View 类使用的所有特征执行 setter 注入(inject):

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 组件执行此操作吗?

主要问题显然是 View 不会由 DI 容器创建,但可以在应用程序流中的任何位置创建。只有在渲染它们之前才需要注入(inject)依赖项。

最后一点:我不依赖于 Symfony 组件。任何其他 DI 容器的线索也将不胜感激。

最佳答案

Symfony 3.3 引入了自动连线服务的理念。
您所要做的就是在您的特征中创建一个 setter 函数并添加 @required 注释。

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

关于php - 交响乐2 : dependency injection and traits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11476222/

相关文章:

php - CodeIgniter Performance 多次加载 View 与 View 循环

sql - 用于 ManyToMany 的 Symfony Doctrine 重命名表

java - Guice:如何避免模块冗余

dependency-injection - DI容器,工厂或临时性元素的新容器?

java - Jersey 是否公开了一种手动将依赖项绑定(bind)到实例的方法?

php - 如何处理 MySQL 中的重叠日期?

php - 如何在 XPATH 中进行 OR 查询表达式

php - Symfony2 使用查询字符串参数路由到 Controller

symfony - 使用 Twig 优化代码

php - Symfony2 中数据库测试的实践?如何隔离?