将 Symfony 命令定义为服务会导致 preg_match() 异常
Defining a Symfony command as a service causes preg_match() exception
我有以下命令,它在调用时成功地将样式化消息打印到 bash 终端:
class DoSomethingCommand extends Command
{
protected function configure()
{
$this->setName('do:something')
->setDescription('Does a thing');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$io->title('About to do something ... ');
$io->success('Done doing something.');
}
}
...但是当我在 services.yml 中添加以下内容以尝试将我的命令定义为服务时...
services:
console_command.do_something:
class: AppBundle\Command\DoSomethingCommand
arguments:
- "@doctrine.orm.entity_manager"
tags:
- { name: console.command }
...我收到此错误:
Warning: preg_match() expects parameter 2 to be string, object given
in
src/app/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:665
我做错了什么?
首先,您注入服务,但您在命令中执行任何构造函数。
这意味着您当前正在将 EntityManager
(对象)注入到命令 class 的参数中(需要 string
或 null
,这就是为什么您有你的错误)
# Symfony\Component\Console\Command\Command
class Command
{
public function __construct($name = null)
{
然后,按照documentation中的定义,你必须调用父构造函数
class YourCommand extends Command
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
// you *must* call the parent constructor
parent::__construct();
}
ContainerAwareCommand
请注意,您的 class 可以扩展 ContainerAwareCommand
,您将能够通过 $this->getContainer()->get('SERVICE_ID')
访问 public 服务。
这不是一个坏习惯,因为可以将命令视为控制器。 (通常你的控制器会注入容器)
我有以下命令,它在调用时成功地将样式化消息打印到 bash 终端:
class DoSomethingCommand extends Command
{
protected function configure()
{
$this->setName('do:something')
->setDescription('Does a thing');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$io = new SymfonyStyle($input, $output);
$io->title('About to do something ... ');
$io->success('Done doing something.');
}
}
...但是当我在 services.yml 中添加以下内容以尝试将我的命令定义为服务时...
services:
console_command.do_something:
class: AppBundle\Command\DoSomethingCommand
arguments:
- "@doctrine.orm.entity_manager"
tags:
- { name: console.command }
...我收到此错误:
Warning: preg_match() expects parameter 2 to be string, object given in src/app/vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:665
我做错了什么?
首先,您注入服务,但您在命令中执行任何构造函数。
这意味着您当前正在将 EntityManager
(对象)注入到命令 class 的参数中(需要 string
或 null
,这就是为什么您有你的错误)
# Symfony\Component\Console\Command\Command
class Command
{
public function __construct($name = null)
{
然后,按照documentation中的定义,你必须调用父构造函数
class YourCommand extends Command
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
// you *must* call the parent constructor
parent::__construct();
}
ContainerAwareCommand
请注意,您的 class 可以扩展 ContainerAwareCommand
,您将能够通过 $this->getContainer()->get('SERVICE_ID')
访问 public 服务。
这不是一个坏习惯,因为可以将命令视为控制器。 (通常你的控制器会注入容器)