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