我在symfony3上有一个很棒的项目。在这个项目中,我有ProjectFrameworkBundle。
项目/ FrameworkBundle /控制台/ Command.php
abstract class Command extends ContainerAwareCommand
{
//...
protected function execute(InputInterface $input, OutputInterface $output)
{
// do some regular staff
$exitCode = $this->executeCommand($input, $output);
// do some regular staff
}
abstract protected function executeCommand(InputInterface $input, OutputInterface $output);
//...
}
如果我将从Command类扩展任何命令,它将正常工作(已测试)。
但是,我有另一个包
项目/ FrameworkQueue /控制台/ Command.php
use Project\FrameworkBundle\Console\Command as BaseCommand;
abstract class Command extends BaseCommand
{
// ...
protected function executeCommand(InputInterface $input, OutputInterface $output)
{
// do some regular staff
$exitCode = $this->executeJob($input, $output);
// do some regular staff
}
abstract protected function executeJob(InputInterface $input, OutputInterface $output);
// ...
}
因此,当我将amy命令从extends Project\FrameworkBundle\Console\Command
更改为extends Project\QueueBundle\Console\Command
时,它会从命令列表中隐藏。我试图删除executeCommand
中QueueBundle
的所有工作人员,但这对我没有帮助。但如果我在这个命令中的PHP代码中犯了任何错误,我会看到异常。
有什么不对?我的错误在哪里或者这是一个错误。我在哪里可以找到收集和检查可用命令的symfony代码?
谢谢!
P.S。问题不在文件或类命名中 - 我多次检查它。当然,当我改变父类时,我改变了函数名。
答案 0 :(得分:1)
如果命令扩展了ContainerAwareCommand,Symfony甚至会注入容器。但如果没有 - 你必须将你的命令注册为服务。
#app / config / config.yml 服务:
app.command.your_command:
class: Project\FrameworkBundle\Command\Console\YourCommand
tags:
- { name: console.command }
在编译内核期间,Symfony通过标记 console.command 找到您的命令并注入应用程序命令列表
要查看有关此主题的详细信息,您可以查看官方文档 - https://symfony.com/doc/current/console/commands_as_services.html
答案 1 :(得分:1)
问题在于覆盖__construct
中的QueueBundle\Console\Command
方法。如果您尝试这样做:
public function __construct($name)
{
parent::__construct($name);
}
......它不起作用。我不知道为什么,但我从这里把一些逻辑移到“执行前”行动。
全部谢谢!