Symfony 从容器中获取服务而无需 DI

问题描述 投票:0回答:1

我目前正在处理捆绑包(symfony 版本:6.4)中的命令,其中我需要获取服务的实例,而无法注入服务。我只有变量中的服务类名,如下所示:

if (!empty($remoteService = $reflection->getAttributes(GetDataFromRemoteService::class))) {
    $serviceFqcn = $remoteService[0]->getArguments()['serviceFqcn'];
    $method = $remoteService[0]->getArguments()['method'];

    if (class_exists($serviceFqcn)) {
        if (method_exists($serviceFqcn, $method)) {
            $container = new ContainerBuilder;
            dd($container->get($serviceFqcn));
        }
    }
}

此代码返回错误:

You have requested a non-existent service "App\Service\SomeService"

我不能只实例化服务,因为它太复杂了,因为我有大约 30 个这样的服务,而且它们都注入了依赖项。最简单的方法是将服务添加到容器中,然后从容器中检索服务的实例。

服务可以是私有的或公共的,合成的或非合成的,惰性的或非惰性的,我无法事先知道。

我怎样才能以最低的成本实现这一目标。

symfony dependency-injection containers command symfony6
1个回答
0
投票

我找到了一个看起来不太好的解决方法,但我仍然会发布它。

我能够让这部分像这样工作:

if (!empty($remoteService = $reflection->getAttributes(GetDataFromRemoteService::class))) {
    $serviceFqcn = $remoteService[0]->getArguments()['serviceFqcn'];
    $method = $remoteService[0]->getArguments()['method'];

    if (class_exists($serviceFqcn)) {
        if (method_exists($serviceFqcn, $method)) {
            $service = $this->container->get($serviceFqcn);
            $data = $service->$method();

            foreach ($data as $object) {
                dump($object);
            }
        }
    }
}

在我的命令的构造函数中(前2个参数在其他地方使用):


public function __construct(
    private readonly ElasticService $elasticService,
    private readonly EntityManagerInterface $doctrine,
    private readonly Symfony\Component\DependencyInjection\Container $container
)
{
    parent::__construct();
}

在bundle/config/yaml中:


  Eyrolles\Intranet\ElasticBundle\Command\:
    resource: '../src/Command/'
    arguments: ['@Something\ElasticBundle\Service\ElasticService', '@doctrine.orm.entity_manager', '@service_container']
© www.soinside.com 2019 - 2024. All rights reserved.