0

如何使用 Akeneo\Pim\AkeneoPimClientInterface 在 Symfony 中扩展生成的命令?

我使用 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
4

1 回答 1

1

由于您扩展了ContainerAwareCommand您可以访问 Symfony 的服务容器来获取这样的客户端(您可能必须用服务 id 替换完全限定的类名,我不是 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是您“提供”给命令的第一个参数。

于 2018-02-21T09:26:46.267 回答