<?php
namespace MyBundle\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use The\Class\Of\The\Service\I\Wanted\Injected;
class SomeCommand extends Command
{
protected $someService;
public function setSomeService(Injected $someService)
{
$this->someService = $someService;
}
...
parameters:
services:
_defaults:
autowire: true
autoconfigure: true
# Here might be some other services...
App\Command\MyCommand:
arguments: [
'@security.csrf.token_storage'
]
然后在命令类中使用构造函数中的服务:
class MyCommand extends Command
{
private $csrfToken;
public function __construct(CsrfToken $csrfToken)
{
parent::__construct();
$this->csrfToken = $csrfToken;
}
}
8条答案
按热度按时间pcrecxhr1#
自Symfony4.2以来,ContainerAwareCommand 已被取代。请改用DI。
mwg9r5ms2#
最好不要注入容器本身,而是将容器中的服务注入到对象中。如果你使用的是Symfony 2的容器,那么你可以这样做:
MyBundle/Resources/config/services(或您决定放置此文件的任何位置):
那么您的命令类应该如下所示:
我知道你说过你没有使用依赖注入容器,但是为了实现上面的@ramon的答案,你必须使用它。至少这样你的命令可以被正确地进行单元测试。
bsxbgnwa3#
从ContainerAwareCommand扩展Command类,并使用
$this->getContainer()->get('my_service_id');
获取服务t3psigkw4#
您可以使用ContainerCommandLoader来提供PSR-11容器,如下所示:
ChangeMode类可以定义如下:
注意:应在容器配置中提供ChangeMode。
pb3s4cty5#
我说的是symfony2.8。您不能向扩展ContainerAwareCommand的类添加构造函数,因为扩展的类有一个
$this->getContainer()
,它让您可以获取服务,而不是通过构造函数注入服务。你可以做
$this->getContainer()->get('service-name');
cl25kdpy6#
转到服务.yaml
将This添加到文件中(我使用了2个现有服务作为示例):
要查看所有服务的列表,请在项目根文件夹的终端中键入:
您将得到一个可以使用的服务的长列表,其中一行的示例如下所示:
因此,如果CSRF令牌服务是您正在寻找的(例如),您将使用括号中的部分作为服务:(安全性.csrf.令牌存储)
所以你的services.yaml看起来像这样:
然后在命令类中使用构造函数中的服务:
siv3szwd7#
在Symfony 3.4中,如果正确配置了autowire,则可以将服务注入到命令的构造函数中。
aydmsdu98#
php 8.1下载