PHP-DI injectOn不注入setter方法

时间:2016-11-25 14:11:48

标签: php dependency-injection inversion-of-control php-di

我在使用ContainerBuilder配置容器时设置了依赖关系和定义,然后对其进行编译以获得实际的Container,但每当我尝试注入依赖关系时,它们总是会被忽略。

我是否错过了injectOn()方法的概念,或者我在这里做错了什么($this->translator仍然未分配)?我已尝试过不同的方法,包括实例化类并将对象添加到ContainerBuilder并将其作为\DI\object()定义传递,两者都具有相同的结果。

<?php
include "../vendor/autoload.php";

class Translator
{}

class TextHandle
{
    protected $translator;

    public function setTranslator (Translator $translator)
    {
        $this->translator = $translator;
    }

    public function test ()
    {
        var_dump($this->translator);
    }
}

class TestCase
{
    protected $translator;

    public function __construct (Translator $translator)
    {
        $this->translator = $translator;
    }
}

// Setup container
$containerBuilder = new \DI\ContainerBuilder();
$containerBuilder->addDefinitions([
    Translator::class => \DI\object(),
]);

$container = $containerBuilder->build();

// Create object and inject
$textHandle = new TextHandle();
$container->injectOn($textHandle);

// Test injection, fails
$textHandle->test(); // NULL

// Test access, works
$translator = $container->get(Translator::class);
var_dump($translator); // object(Translator)#18 (0) {}

// Try having the container instantiate
$textHandle = $container->make(TextHandle::class);
$textHandle->test(); // Null

// Try object with constructor, works
$testCase = $container->make(TestCase::class);
var_dump($testCase); // Translator is set

1 个答案:

答案 0 :(得分:4)

根据{{3}},PHP-DI不会通过setter执行自动装配。

您应该添加TextHandle类的定义并将其配置为通过setter注入Translator

$containerBuilder->addDefinitions([
    TextHandle::class => \DI\object()->method('setTranslator', \DI\get(Translator::class))
]);