С помощью консоли 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
?
После возни в 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"
Вы объединяете две вещи вместе. Вариант без значения 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)
Вы можете просто установить параметр $ default false
и проверьте:
false
опция не существуетnull
опция существует без значениянапример
$this->addOption('force', null, InputOption::VALUE_OPTIONAL, 'Force something', false)
$force = $input->getOption('force') !== false;