Cou*_*les 8 php symfony 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.'
);
}
}
Run Code Online (Sandbox Code Playgroud)
命令帮助将说明选项--option[=OPTION],所以我可以通过以下方式调用它.
bin/console test
bin/console test --option
bin/console test --option=foo
Run Code Online (Sandbox Code Playgroud)
但是,$input->getOption()将NULL在前两种情况下返回.我预计在第二种情况下它会返回TRUE,或者表示提供选项的东西.
所以我不知道如何识别根本没有提供的选项的差异,它是提供但没有值.
如果没有办法区分,那么用例是InputOption::VALUE_OPTIONAL什么?
小智 11
从 Symfony 3.4 开始,您可以将默认值设置为false并检查:
false该选项不存在null该选项,则该选项没有值存在例如
$this->addOption('force', null, InputOption::VALUE_OPTIONAL, 'Force something', false);
$force = $input->getOption('force') !== false;
Run Code Online (Sandbox Code Playgroud)
探究之后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
没有什么可以禁止您创建一个带有可选项接受值的选项的命令.但是,没有办法可以区分何时使用没有值的选项(命令 - 语言)或者根本没有使用它(命令).在这两种情况下,为该选项检索的值都将为null.
这完全描述了你的情况.
您无法区分何时未传递参数或传递参数但没有值.这就是InputOption::VALUE_NONE为此而做的.
根据您的用例,您可以将在使用的参数提供一个默认值console test和console test --option情况.
另请注意,addOption将第二个参数作为参数作为参数.
public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
Run Code Online (Sandbox Code Playgroud)