使用接口AkeneoPimClientInterface扩展类?

时间:2018-02-21 08:40:09

标签: php symfony symfony-2.8 akeneo

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

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

class AppTriggerBuildCommand extends ContainerAwareCommand

然后将其发展到我需要API中的所有类别时。无缝地这是一个简单的问题,如何在命令中使用AkeneoPimClientInterface。

我想用它这样的东西。

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

这里的apiClient来自_contruct metod

    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

1 个答案:

答案 0 :(得分: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是您“命令”命令的第一个参数。