我正在使用 php-di 6.0.10
我的 DI 配置中有接口实现:
\App\Writer\WriterInterface::class => DI\get(\App\Writer\Text::class)
它有这样的构造函数:
class TextWriter implements WriterInterface
...
public function __construct(Settings $settings, DataConverter $dataConverter, string $filePath)
{
$this->init($filePath);
$this->settings = $settings;
$this->dataConverter = $dataConverter;
}
在我的应用程序中,我想用动态 $filePath 参数实例化编写器:
$this->container->make(WriterInterface::class, ['filePath' => $this->getFilePath()]);
但我得到这个错误:
DI\Definition\Exception\InvalidDefinition:无法解析条目“App\Writer\Text”:__construct() 的参数 $filePath 没有定义的值或可猜测的完整定义:Object ( class = App\Writer\Text lazy = false __construct( $settings = get(App\Settings) $dataConverter = get(App\DataConverter) $filePath = #UNDEFINED#)
怎么了?我深入研究 DI 代码,发现它像 \DI\Definition\SelfResolvingDefinition 一样处理我的定义,并且没有将参数传递给 resolve() 方法。它仅在我明确指定接口实现时才有效 - App\Writer\Text 用于 make() 方法。但我需要有动态接口实现。
如何让它以我想要的方式工作?