Как определить, была ли опция предоставлена ​​без значения с Symfony Console?

С помощью консоли Symfony3 как узнать, когда пользователь предоставил параметр, но предоставил его без значения? В отличие от того, чтобы вообще не предоставлять опцию?

В качестве примера возьмем следующую конфигурацию консоли.

<?php

class MyCommand extends \Symfony\Component\Console\Command\Command
{
// ...

protected function configure()
{
$this->setName('test')
->setDescription('update an existing operation.')
->addOption(
'option',
null,
InputOption::VALUE_OPTIONAL,
'The ID of the operation to update.'
);
}
}

Команда help проиллюстрирует опцию как --option[=OPTION]Так что я могу назвать это следующими способами.

bin/console test
bin/console test --option
bin/console test --option=foo

Тем не мение, $input->getOption() вернусь NULL в первых двух случаях. Я ожидал во втором случае, что он вернется TRUEили что-то, чтобы указать, что опция была предоставлена.

Поэтому я не знаю, как определить разницу, когда опция вообще не предоставляется, а предоставляется, но без значения.

Если нет никакой возможности определить разницу, каков вариант использования InputOption::VALUE_OPTIONAL?

6

Решение

После возни в Symfony\Component\Console\Input\InputInterfaceЯ обнаружил getParameterOption() метод, который дает возможность различать неиспользуемый параметр, параметр, используемый без значения, и параметр, используемый со значением.

В команде configure() метод:

$this->addOption('test', null, InputOption::VALUE_OPTIONAL);

В команде execute() метод:

$test = $input->getOption('test');
$rawTest = $input->getParameterOption('--test');

Создает следующие значения для заданных командных строк:

> bin/console some:cmd

$test => null

$rawTest => false

> bin/console some:cmd --test

$test => null

$rawTest => null

> bin/console some:cmd --test=something

$test => "something"

$rawTest => "something"

4

Другие решения

Вы объединяете две вещи вместе. Вариант без значения InputOption::VALUE_NONE и опция с необязательным значением InputOption::VALUE_OPTIONAL,

В документации сказано: http://symfony.com/doc/current/console/input.html

Ничто не запрещает вам создавать команду с опцией, которая может принимать значение. Тем не менее, вы никак не можете различить, когда опция использовалась без значения (команда —language) или когда она вообще не использовалась (команда). В обоих случаях значение, полученное для опции, будет нулевым.

Это точно описывает ваш случай.

Вы не можете различить, когда параметр не был передан вообще или был передан, но без значения. Это то что InputOption::VALUE_NONE был сделан для.

В зависимости от вашего варианта использования вы можете указать значение по умолчанию для параметра, который будет использоваться в console test а также console test --option случаев.

Также обратите внимание, что addOption принимает в качестве аргумента ярлык в качестве второго аргумента.

public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
4

Вы можете просто установить параметр $ default false и проверьте:

  1. если значение false опция не существует
  2. если значение null опция существует без значения
  3. в противном случае это имеет свою ценность

например

$this->addOption('force', null, InputOption::VALUE_OPTIONAL, 'Force something', false)

$force = $input->getOption('force') !== false;

1
По вопросам рекламы [email protected]