如何使用Symfony DI和container->get(.)

cxfofazt  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(96)

我正在写一个小的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。

qojgxg4l

qojgxg4l1#

我已经建立了你的情况下,可以重现错误消息.目前,我不能解释为什么没有与反射缓存autowire.实际上,它应该工作的方式.我不知道它是否与此有关,因为DependencyInjection是作为一个独立的使用.
一个可能的解决办法是:

services:

  # ...

  denormalizer_service:
    class: FileToObject\Denormalizer
    arguments:
      - '@FileToObject\ReflectionCache'
$this->container->get('denormalizer_service');

相关问题