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
(对象(注入命令类的参数(需要string
或null
,这就是为什么您有错误的原因(
# 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')
访问公共服务。这不是一个不好的做法,因为命令可以看作是控制器。(通常您的控制器注入容器(