Расширяете класс с помощью интерфейса 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

0

Решение

Поскольку вы расширяете 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 это первый аргумент, который вы «кормите» для команды.

1

Другие решения

Других решений пока нет …