提问者:小点点

将Symfony命令定义为服务会导致preg_match()异常


我有以下命令,当调用时,它成功地将样式化的消息打印到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.');
    }
}

... 但当我在服务中添加以下内容时。yml为了尝试将我的命令定义为服务。。。

services:
  console_command.do_something:
    class: AppBundle\Command\DoSomethingCommand
    arguments:
      - "@doctrine.orm.entity_manager"
    tags:
      - { name: console.command }

... 我得到这个错误:

警告:preg_match()期望参数2为字符串,对象以src/app/供应商/symfony/symfony/src/Symfony/Component/Console/命令/Command.php:665

我做错了什么?


共1个答案

匿名用户

首先,注入服务,但在命令中执行任何构造函数。

这意味着您当前正在将EntityManager(对象)注入命令类的参数中(该类需要字符串或null,这就是您出现错误的原因)

# Symfony\Component\Console\Command\Command
class Command
{
    public function __construct($name = null)
    {

然后,按照文档中的定义,您必须调用父构造函数

class YourCommand extends Command
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;

        // you *must* call the parent constructor
        parent::__construct();
    }

ContainerWareCommand

注意,您的类可以扩展ContainerWareCommand,您将能够通过$this访问公共服务-