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

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

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

class AppTriggerBuildCommand extends ContainerAwareCommand

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

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

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

И apiClient здесь входит в метод _contruct

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

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

use Akeneo\Pim\AkeneoPimClientInterface as AkeneoPimClient;

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

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

Сборка триггера приложения/консоли php -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

person FortuneSoldier    schedule 21.02.2018    source источник


Ответы (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 — это первый аргумент, который вы «подаете» команде.

person dbrumann    schedule 21.02.2018
comment
Когда я делаю то, что вы предложили, я получаю ту же ошибку, что и раньше во время разработки. Кажется, ему нужны некоторые параметры в строке parent::__construct(); Не уверена.. - person FortuneSoldier; 21.02.2018
comment
Возможно, вам придется передать имя команды: parent::__construct('trigger') - person dbrumann; 21.02.2018
comment
Хотя теоретически null тоже допустимо. См.: github.com/ symfony/symfony/blob/2.8/src/Symfony/Компонент/ - person dbrumann; 21.02.2018
comment
Может быть, это относится к другому конструктору, а не к тому, который принадлежит вашей команде? - person dbrumann; 21.02.2018
comment
Это относится к Команде -- public function __construct($name = null) { $this-›definition = new InputDefinition(); if (null !== $name) { $this-›setName($name); } $this-›configure(); if (!$this-›name) { throw new LogicException(sprintf('Команда, определенная в %s, не может иметь пустое имя.', get_class($this))); } } А когда он нулевой, то выводит ошибку, которая упоминается в самой задаче. - person FortuneSoldier; 21.02.2018
comment
Я только что обновил ответ. Похоже, проблема в имени вашей команды. Он читает trigger как имя команды и build как аргумент этой команды. - person dbrumann; 21.02.2018
comment
Это было моим намерением накормить его только именем команды, называемой триггером, и первым аргументом является «сборка». - person FortuneSoldier; 21.02.2018
comment
Это мой метод настройки -- защищенная функция configure() { $this -->setName('trigger') -->setDescription('...') -->addArgument('argument', InputArgument::OPTIONAL, 'Описание аргумента' ) ->addArgument('язык', InputArgument::ОПЦИОНАЛЬНО, 'Описание языка') -›addArgument('страница', InputArgument::ОПЦИОНАЛЬНО, 'Описание страницы') ; } - person FortuneSoldier; 21.02.2018
comment
Давайте продолжим обсуждение в чате. - person FortuneSoldier; 21.02.2018