我正在写一个小的lib(名为FileToObject),我想在这个lib中使用Symfony依赖注入组件,而不使用Symfony框架本身。所以在我的lib中,我有一个入口点类,在那里我读取我的服务配置,示例化我的DI容器并尝试获得一个服务(名为Denormalizer
):
<?php
namespace FileToObject;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class Reader
{
protected ContainerBuilder $container;
public function __construct()
{
// instanciating the DI container
$this->container = new ContainerBuilder();
$loader = new YamlFileLoader($this->container, new FileLocator(__DIR__));
// load service configuration
$loader->load('services.yaml');
}
// ...
public function dataToObject(array $data, string $rootClassPath): object
{
// trying to get the service
$denormalizer = $this->container->get(Denormalizer::class);
// ...
}
}
服务配置与其余的lib代码位于同一个目录中,看起来像这样:
services:
_defaults:
autowire: true
public: true
FileToObject\:
resource: './*'
因此,根据我的理解,我的代码中的每个类都应该可以作为公共服务使用,d.i.可以与$containter->get(...)
一起使用,并且应该自动连接。
然而,这并不适用于我的Denormalizer
-Service,它具有以下签名(ReflectionCache只是我的lib中的另一个类):
class Denormalizer
{
public function __construct(protected ReflectionCache $reflections) {
}
// ...
}
当尝试执行代码时,我得到以下错误:
Too few arguments to function FileToObject\Denormalizer::__construct(), 0 passed and exactly 1 expected
因此,找到了Denormalizer-Service,但未自动连接。如果可能,如何让容器自动连接此Service?
编辑:忘了提,symfony组件连接到symfony v6.3。
1条答案
按热度按时间qojgxg4l1#
我已经建立了你的情况下,可以重现错误消息.目前,我不能解释为什么没有与反射缓存autowire.实际上,它应该工作的方式.我不知道它是否与此有关,因为DependencyInjection是作为一个独立的使用.
一个可能的解决办法是: