Как динамически внедрить сервисы в Symfony Command на основе аргумента команды. - PullRequest
0 голосов
/ 15 октября 2018

У меня есть команда Symfony, которая принимает аргумент, который служит локатором для конкретной требуемой службы (на основе этого аргумента).

т.е.

bin/console some:command service-locator-id

в Symfony 2.8 вы можете просто извлечь службу из контейнера

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

Однако в Symfony 3.4 контейнер устарел, и мы должны использовать Dependency Injection.

Как внедрить нужную мне службу на основе аргумента, передаваемого в Команду?

1 Ответ

0 голосов
/ 15 октября 2018

Хорошо, я наконец-то смог понять это, используя документацию по сервисному локатору.

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);
        }
    }
}

Работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...