Symfony2自定义控制台命令不工作
我在src/MaintenanceBundle/Command中创建了一个新类,名为GreetCommand.php,并在其中添加了以下代码:Symfony2自定义控制台命令不工作,symfony,Symfony,我在src/MaintenanceBundle/Command中创建了一个新类,名为GreetCommand.php,并在其中添加了以下代码: <?php namespace SK2\MaintenanceBundle\Command; use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputArgument; use Symfo
<?php
namespace SK2\MaintenanceBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class GreetCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('maintenance:greet')
->setDescription('Greet someone')
->addArgument('name', InputArgument::OPTIONAL, 'Who do you want to greet?')
->addOption('yell', null, InputOption::VALUE_NONE, 'If set, the task will yell in uppercase letters')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$name = $input->getArgument('name');
if ($name) {
$text = 'Hello '.$name;
} else {
$text = 'Hello';
}
if ($input->getOption('yell')) {
$text = strtoupper($text);
}
$output->writeln($text);
}
}
?>
并试图通过
应用程序/控制台维护:欢迎Fabien
但我总是会遇到以下错误:
[无效辩论例外]
“维护”命名空间中未定义任何命令
有什么想法吗?我想你必须在
configure
方法中调用parent::configure()
,我找到了它不起作用的原因:我只是忘了在AppKernel.php中注册包。但是,其他建议的答案是相关的,可能有助于解决其他情况
按照惯例:命令文件需要驻留在bundle的命令目录中,并且名称以command结尾
在AppKernel.php中
public function registerBundles()
{
$bundles = [
...
new MaintenanceBundle\MaintenanceBundle(),
];
return $bundles;
}
我遇到了这个问题,这是因为我的PHP类和文件的名称没有以
Command
结尾
Symfony将自动注册以
Command
结尾的命令,这些命令位于捆绑包的Command
目录中。如果您想手动注册命令,此cookbook条目可能会有所帮助:我遇到了类似的问题,并找到了另一种可能的解决方案:
如果覆盖默认的\u构造
方法,Symfony将不会自动注册该命令,因此您必须采用前面提到的服务方法,或者删除\u构造
覆盖,并在execute方法或configure方法中执行该初始步骤
实际上,有人知道如何在Symfony命令中执行init“stuff”的最佳实践吗
我花了一点时间才弄明白这一点。除了MonocroM的答案之外,我的命令也有同样的问题,Symfony默默地忽略了我的命令,只是因为我的命令的构造函数有一个必需的参数
我刚刚删除了它,并调用了父级
\uu construct()
方法(Symfony 2.7),它工作得很好;) 在我的例子中,它抱怨“工作流”名称空间,尽管框架正确地提供了名称空间
但是,它无法运行,因为我没有定义任何工作流,因此命令的方法返回了
false
如果您过度使用命令构造函数并使用延迟加载/自动连接,那么您的命令将不会自动注册。要解决此问题,可以添加$defaultName
变量:
class SunshineCommand extends Command
{
protected static $defaultName = 'app:sunshine';
// ...
}
链接到。我试图在
configure
方法中使用通过构造函数传递的服务:
class SomeCommand extends Command {
private $service;
public function __construct(SomeService $service) {
$this->service = $service;
}
protected function configure(): void {
$this->service->doSomething(); // DOES NOT WORK
}
}
当我试图用PHPUnit测试我的命令执行时,我遇到了同样的错误 这是由于错误的类导入造成的:
use Symfony\Component\Console\Application;
应该是
use Symfony\Bundle\FrameworkBundle\Console\Application;
cf.Symfony使用自动配置,自动将依赖项注入到您的服务中,并将您的服务注册为命令、事件等 因此,首先确保您的配置文件夹中有services.yaml。使用自动配置:true。
这是默认设置 然后确保所有文件与类的名称完全相同。
因此,如果您有SimpleClass,那么您的文件必须是SimpleClass.php,如果您因为构造函数而出现问题, 转到services.yml并添加如下内容:
app.email_handler_command:
class: AppBundle\Command\EmailHandlerCommand
arguments:
- '@doctrine.orm.entity_manager'
- '@app.email_handler_service'
tags:
- { name: console.command }
你在创建命令后清除缓存了吗?这一个让我抓到了。您必须将命令存储在bundle的命令目录中,并在末尾用Command命名命令类。然后Symfony将自动正确注册所有内容。我刚刚遇到了这个问题,这是因为文件名末尾没有“Command”-因此导致这个问题的不仅仅是名称空间或目录名/位置。谢谢@ScottFlack。我已经更新了我的帖子,以便更清楚地说明文件名必须以
命令
结尾,而不仅仅是类名。这一条让我明白了。干杯回塞特注射!