使用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.'
);
}
}
命令帮助会将选项说明为--option[=OPTION]
,因此我可以通过以下方式调用此选项。
bin/console test
bin/console test --option
bin/console test --option=foo
但是,$input->getOption()
会在前两种情况下返回NULL
。我预计在第二种情况下会返回TRUE
,或者表示该选项已被提供的东西。
所以我不知道如何识别根本没有提供的选项的区别,并且它被提供但没有值。
如果没有办法区分,InputOption::VALUE_OPTIONAL
的用例是什么?
答案 0 :(得分:5)
你将两件事结合在一起。没有值InputOption::VALUE_NONE
的选项和带有可选值InputOption::VALUE_OPTIONAL
的选项。
文档说:http://symfony.com/doc/current/console/input.html
没有什么可以禁止您使用可选择接受值的选项创建命令。但是,没有办法可以区分何时使用没有值的选项(命令 - 语言)或者根本没有使用它(命令)。在这两种情况下,为该选项检索的值都将为空。
这完全描述了你的情况。
您无法区分参数何时未通过或已通过但没有值。那是InputOption::VALUE_NONE
的目的。
根据您的用例,您可以为console test
和console test --option
个案例中使用的参数提供默认值。
另请注意,addOption
将快捷方式作为参数作为第二个参数。
public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
答案 1 :(得分:5)
在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
=&gt; null
$rawTest
=&gt; false
> bin/console some:cmd --test
$test
=&gt; null
$rawTest
=&gt; null
> bin/console some:cmd --test=something
$test
=&gt; "something"
$rawTest
=&gt; "something"
答案 2 :(得分:2)
从Symfony 3.4开始,您可以将默认值设置为false
并检查:
false
该选项不存在null
,则选项不存在值e.g。
$this->addOption('force', null, InputOption::VALUE_OPTIONAL, 'Force something', false);
$force = $input->getOption('force') !== false;