如何基于命令参数将服务动态注入Symfony Command。

时间:2018-10-14 23:36:03

标签: symfony

我有一个Symfony命令,该命令接受一个参数,该参数用作所需特定服务的定位器(基于该参数)。

即。

bin/console some:command service-locator-id

使用Symfony 2.8,您可以简单地从容器中获取服务

$service = $this->container->get($input->getArgument('service-locator-id'));

但是对于Symfony 3.4,该容器已被弃用,我们应该使用依赖注入。

如何根据传递给Command的参数注入所需的服务?

1 个答案:

答案 0 :(得分:1)

好吧,我终于可以使用服务定位器文档来解决这个问题。

https://symfony.com/doc/3.4/service_container/service_subscribers_locators.html

基本上,

class MyCommand extends ContainerAwareCommand implements ServiceSubscriberInterface
{

    private $locator;

    private $serviceId;

    public static function getSubscribedServices()
    {
        return [
            'service-locator-id-one' => ServiceClassOne::class,
            'service-locator-id-two' => ServiceClassTwo::class,
        ];
    }

    /**
     * @required
     * @param ContainerInterface $locator
     */
    public function setLocator(ContainerInterface $locator)
    {
        $this->locator = $locator;
    }

    protected function configure()
    {
        $this
        ->setName('some:command')
        ->addArgument('service-locator-id', InputArgument::REQUIRED, 'Service Identifier');
    }

    /**
     * 
     * @return void|MyServiceInterface
     */
    private function getService()
    {
        if ($this->locator->has($this->serviceId)) {
            return $this->locator->get($this->serviceId);
        }
    }
}

完美运行。