Пользовательская консольная команда Symfony2 не работает - PullRequest
11 голосов
/ 13 сентября 2011

Я создал новый класс в 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);
    }
}

?>

И попытался позвонить через

обслуживание приложений / консолей: greet Fabien

Но я всегда получаю следующую ошибку:

[InvalidArgumentException] В пространстве имен «техобслуживание» не определены команды.

Есть идеи?

Ответы [ 7 ]

55 голосов
/ 01 сентября 2014

У меня была эта проблема, потому что имя моего класса PHP и файла не заканчивалось на Command.

Symfony автоматически регистрирует команды, которые заканчиваются на Command и находятся в каталоге Command пакета. Если вы хотите вручную зарегистрировать свою команду, эта запись в поваренной книге может помочь: http://symfony.com/doc/current/cookbook/console/commands_as_services.html

16 голосов
/ 21 сентября 2011

Я выяснил, почему это не работает: я просто забыл зарегистрировать Bundle в AppKernel.php. Тем не менее, другие предложенные ответы актуальны и могут быть полезны для разрешения других ситуаций!

По соглашению: файлы команд должны находиться в каталоге команд пакета и иметь имя, оканчивающееся на Command.

в AppKernel.php

public function registerBundles()
{
    $bundles = [
        ...
        new MaintenanceBundle\MaintenanceBundle(),
    ];

    return $bundles;
}
15 голосов
/ 26 апреля 2016

У меня была похожая проблема, и я нашел другое возможное решение:

Если вы переопределите метод __construct по умолчанию, команда не будет автоматически зарегистрирована Symfony, поэтому вам придется либо воспользоваться сервисным подходомкак упомянуто ранее, или удалите переопределение __construct и выполните этот шаг инициализации в методе execute или в методе configure.

Кто-нибудь на самом деле знает хороший передовой опыт, как выполнять "вещи" init в командах Symfony?

Мне потребовалось время, чтобы понять это.

2 голосов
/ 18 июля 2016

В дополнение к ответу MonocroM у меня была та же проблема с моей командой, и Symfony молча игнорировала ее только потому, что у конструктора моей команды был 1 обязательный аргумент.

Я просто удалил его и вызвал родительский метод __construct() (Symfony 2.7), и он сработал;)

1 голос
/ 21 октября 2016

В моем случае он жаловался на пространство имен "рабочий процесс", хотя WorkflowDumpCommand был правильно предоставлен платформой.

Однако он не был доступен для запуска, поскольку я не определил никаких рабочих процессов, поэтому метод команды isEnabled() вернул false.

1 голос
/ 13 сентября 2011

Я думаю, вам нужно вызвать parent::configure() в вашем configure методе

0 голосов
/ 13 марта 2018

Если вы перезагружаете конструктор команд и используете ленивую загрузку / автоматическое подключение, ваши команды не будут автоматически зарегистрированы. Чтобы это исправить, вы можете добавить переменную $defaultName:

class SunshineCommand extends Command
{
    protected static $defaultName = 'app:sunshine';

    // ...
} 

Ссылка на документы Symfony .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...