如何识别Symfony Console提供的选项是否没有值?

yftpprvb  于 2023-05-01  发布在  其他
关注(0)|答案(4)|浏览(128)

使用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的用例是什么?

5cg8jx4n

5cg8jx4n1#

从Symfony 3开始4,你可以设置默认值为false并检查:
1.如果值为false,则选项不存在
1.如果值为null,则存在无值的选项
1.否则它就有它的价值
例如

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

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

amrnrhlw2#

你把两件事结合在一起。没有值InputOption::VALUE_NONE的选项和具有可选值InputOption::VALUE_OPTIONAL的选项。
该文档说:http://symfony.com/doc/current/console/input.html
没有任何东西禁止您创建带有可选地接受值的选项的命令。但是,您无法区分何时使用了不带值的选项(command --language)或何时根本没有使用该选项(command)。在这两种情况下,为该选项检索的值都将为空。
这正好描述了你的情况。
您无法区分什么时候参数根本没有传递,或者传递了但没有值。这就是InputOption::VALUE_NONE的用途。
根据您的使用情况,您可以为console testconsole test --option情况下使用的参数提供默认值。
还要注意,addOption将快捷方式作为第二个参数。

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

ecfdbz9o3#

编辑于6/10/21:这只适用于Symfony 3。3及以下。正确答案现在是ScorpioT 1000提供的答案
在浏览了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"

qc6wkl3g

qc6wkl3g4#

出于某种原因,其他答案对我不起作用。对我有用的是:

if (is_null($input->getParameterOption('--zip', 'NOT_SET'))) {
  // --zip without a value.
}

相关问题