Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2自定义控制台命令不工作_Symfony - Fatal编程技术网

Symfony2自定义控制台命令不工作

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

我在src/MaintenanceBundle/Command中创建了一个新类,名为GreetCommand.php,并在其中添加了以下代码:

<?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。我已经更新了我的帖子,以便更清楚地说明文件名必须以
命令
结尾,而不仅仅是类名。这一条让我明白了。干杯回塞特注射!