gpt4 book ai didi

PHP-DI injectOn 不注入(inject) setter 方法

转载 作者:可可西里 更新时间:2023-10-31 23:01:51 24 4
gpt4 key购买 nike

我在使用 ContainerBuilder 配置容器时设置了依赖项和定义,然后编译它以获得实际的 Container,但是每当我尝试注入(inject)依赖项时,它们总是倾向于被忽略。

我是否错过了 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

最佳答案

根据 the documentation , PHP-DI 不通过 setter 执行 Autowiring 。

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

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

关于PHP-DI injectOn 不注入(inject) setter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com