使用接口 AkeneoPimClientInterface 扩展 class?

Extending the class with an interface AkeneoPimClientInterface?

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

我使用 php app/console generate:command 生成了一个命令,我得到了这个 class:

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 app/console 触发构建-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 的服务容器来像这样获取客户端(你可能必须用服务 ID 替换完全限定的 class 名称,我不是 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 是你 "feed" 命令的第一个参数。