Я получил ошибку на symfony/console Option не выходит. Как я могу разрешить любые параметры, даже не устанавливая их?

Возможно ли в symfony/console разрешить все параметры или аргументы, даже если они не установлены в конфигурации?

Видите ли, на основе следующего примера. Он имеет ->addArgument() и ->addOption(), он устанавливает параметры и опции name и yell соответственно.

http://symfony.com/doc/current/components/console/introduction.html

class GreetCommand extends Command
{

    protected function configure()
    {
        $this
            ->setName('demo: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);
    }
}

Можно ли запустить следующую команду без установки аргументов и параметров?

$ php application.php demo:greet Fabien John Doe --yell --greet --poke

person Nino Paolo    schedule 13.02.2015    source источник


Ответы (1)


Ну а без рефакторинга базового Command класса нельзя, и не зря — все варианты должны быть проверены системой и приняты. Например, для удаленной задачи CRON.

Однако можно сделать так:

->addOption(
    'parameters',
    InputOption::IS_ARRAY,
    'Enter parameters'
);

Таким образом, вы можете рассматривать один параметр как массив и самостоятельно брать на себя ответственность за проверку, обращаясь к нему:

if ($names = $input->getOption('parameters')) {
    $text .= ' '.implode(', ', $parameters);
}

Подробнее здесь.

Ваше здоровье!

person Damaged Organic    schedule 13.02.2015
comment
Спасибо, это очень полезно. Как насчет вариантов у вас есть идеи? - person Nino Paolo; 13.02.2015
comment
Ну, сначала я неправильно понял вопрос, а затем отредактировал свой ответ. Это касается и addOption(). Это привязанная ссылка на раздел: symfony.com/doc /current/components/console/ - но, к сожалению, вам все равно придется использовать именованные аргументы... - person Damaged Organic; 13.02.2015
comment
Спасибо, но я смог понять, как это сделать :) Я немного взломал. - person Nino Paolo; 13.02.2015
comment
Как? Я надеюсь, что это не включало переписывание классов поставщиков :) - person Damaged Organic; 13.02.2015
comment
Это неприятно... но я получаю аргументы команды через $_SERVER['argv'], анализирую аргументы параметров (--OPTION_NAME), а затем добавляю параметр во время выполнения. Вот мой код: github.com/ paolooo/laravel-doctrine/blob/master/src/Console/ - person Nino Paolo; 13.02.2015
comment
О... Выглядит хорошо, но вызывает опасения по поводу безопасности. Будьте осторожны, и удачи! - person Damaged Organic; 13.02.2015