Расширяете класс с помощью интерфейса AkeneoPimClientInterface?

Как расширить сгенерированную команду в Symfony с использованием Akeneo\Pim\AkeneoPimClientInterface?

Я сгенерировал команду с помощью php app/console generate:command и получил этот класс:

class AppTriggerBuildCommand extends ContainerAwareCommand

Затем разработал его до такой степени, что мне нужны все категории из API. Безусловно, это действительно простой вопрос, как я могу использовать AkeneoPimClientInterface в команде.

Я хочу использовать это как-то так.

$categories = $this->apiClient->getCategoryApi()->all();

И этот клиент здесь входит в метод _contruct

    public function __construct(AkeneoPimClient $apiClient, AkeneoLocaleMapper $mapper) {
    $this->apiClient = $apiClient;
    $this->mapper = $mapper;
}

И в использовании

use Akeneo\Pim\AkeneoPimClientInterface as AkeneoPimClient;

Но когда я попытался поместить его в метод _construct в команде, он захотел использовать родительский _construct и просто не может увидеть сгенерированную команду.

Кто-нибудь может мне помочь?

php app / триггерная консоль build -vvv

  [Symfony\Component\Console\Exception\CommandNotFoundException]  
  Command "trigger" is not defined.                               


Exception trace:
 () at /var/www/html/iclei/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:526
 Symfony\Component\Console\Application->find() at /var/www/html/iclei/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:94
 Symfony\Bundle\FrameworkBundle\Console\Application->find() at /var/www/html/iclei/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:190
 Symfony\Component\Console\Application->doRun() at /var/www/html/iclei/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:84
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /var/www/html/iclei/vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:117
 Symfony\Component\Console\Application->run() at /var/www/html/iclei/app/console:27

1 ответ

Решение

Поскольку вы расширяете ContainerAwareCommand у вас есть доступ к служебному контейнеру Symfony для такой загрузки клиента (возможно, вам придется заменить полное имя класса на идентификатор службы, я не уверен на 100%):

$this->container->get('Akeneo\Pim\AkeneoPimClientInterface');

Если вы хотите использовать конструктор (что я рекомендую вам сделать), вы почти у цели. Вам просто нужно также вызвать родительский конструктор:

public function __construct(AkeneoPimClient $apiClient, AkeneoLocaleMapper $mapper)
{
    parent::__construct();

    $this->apiClient = $apiClient;
    $this->mapper = $mapper;
}

Оба способа должны работать, но последний позволяет вам перейти от ContainerAwareCommand к более универсальной ContainerCommand, которая поможет вам с Symfony 4, где службы в контейнере будут частными по умолчанию, и поэтому вы не можете просто получить их из Контейнер, как в первом варианте.

изменить имя команды: вы можете указать имя вашей команды в качестве аргумента parent::__construct() а также установить его через configure() метод, вам нужно переопределить. Там вы можете просто позвонить, например, $this->setName('trigger-build');, Будьте осторожны, не используйте пробелы, так как Symfony будет рассматривать их как отдельные аргументы. Так trigger это имя команды и build это первый аргумент, который вы "кормите" для команды.

Другие вопросы по тегам