将Symfony命令定义为服务引起Preg_match()异常



i具有以下命令,当调用时,它成功地打印到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: AppBundleCommandDoSomethingCommand
    arguments:
      - "@doctrine.orm.entity_manager"
    tags:
      - { name: console.command }

...我得到此错误:

警告:preg_match((期望参数2为字符串,对象给定 在 src/app/vendor/symfony/symfony/src/symfony/component/console/command/command.php:665

我在这里做错了什么?

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

这意味着您当前正在将EntityManager(对象(注入命令类的参数(需要stringnull,这就是为什么您有错误的原因(

# SymfonyComponentConsoleCommandCommand
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();
    }

containerawarecommand

注意,您的班级可以扩展ContainerAwareCommand,您将能够通过$this->getContainer()->get('SERVICE_ID')访问公共服务。这不是一个不好的做法,因为命令可以看作是控制器。(通常您的控制器注入容器(

相关内容

  • 没有找到相关文章

最新更新