Внедрение зависимостей — PHP-DI injectOn не внедряется в методах установки

У меня есть настройки и определения при настройке контейнера с помощью 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

4

Решение

В соответствии с документация, PHP-DI не выполняет автоматическое подключение через сеттеры.

Вы должны добавить определение для TextHandle Класс и настроить его для инъекций Translator через сеттер:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]