11

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

4

3 回答 3

12

从 Symfony 3.4 开始,您只需将默认设置为false并检查:

  1. 如果值为false选项不存在
  2. 如果值是null选项存在但没有值
  3. 否则它有它的价值

例如

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

$force = $input->getOption('force') !== false;
于 2018-05-24T21:22:32.347 回答
7

你把两件事结合在一起。没有值InputOption::VALUE_NONE的选项和具有可选值的选项InputOption::VALUE_OPTIONAL

文档说:http ://symfony.com/doc/current/console/input.html

没有什么禁止您创建带有可选接受值的选项的命令。但是,您无法区分该选项是在没有值的情况下使用(命令 --language)还是根本没有使用(命令)。在这两种情况下,为选项检索的值都将为空。

这准确地描述了你的情况。

您无法区分参数根本没有传递或传递但没有值。这就是InputOption::VALUE_NONE为之而生的。

根据您的用例,您可以为将在各种情况下使用的参数提供默认console testconsole test --option

另请注意,这addOption将快捷方式作为第二个参数作为参数。

public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
于 2016-09-09T08:32:41.313 回答
7

21 年 6 月 10 日编辑:这仅适用于 Symfony 3.3 及更低版本。正确答案现在是 ScorpioT1000 提供的那个

在探索之后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"

于 2017-11-03T05:50:56.277 回答