У меня есть настройки и определения при настройке контейнера с помощью 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
В соответствии с документация, PHP-DI не выполняет автоматическое подключение через сеттеры.
Вы должны добавить определение для TextHandle
Класс и настроить его для инъекций Translator
через сеттер:
$containerBuilder->addDefinitions([
TextHandle::class => \DI\object()->method('setTranslator', \DI\get(Translator::class))
]);
Других решений пока нет …