我目前正在处理捆绑包(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 个这样的服务,而且它们都注入了依赖项。最简单的方法是将服务添加到容器中,然后从容器中检索服务的实例。
服务可以是私有的或公共的,合成的或非合成的,惰性的或非惰性的,我无法事先知道。
我怎样才能以最低的成本实现这一目标。
我找到了一个看起来不太好的解决方法,但我仍然会发布它。
我能够让这部分像这样工作:
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']