使用接口 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" 命令的第一个参数。
如何使用 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" 命令的第一个参数。