如何使用Symfony控制台识别是否提供了没有值的选项?

时间:2016-09-09 08:04:45

标签: 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.'
            );
    }
}

命令帮助会将选项说明为--option[=OPTION],因此我可以通过以下方式调用此选项。

bin/console test
bin/console test --option
bin/console test --option=foo

但是,$input->getOption()会在前两种情况下返回NULL。我预计在第二种情况下会返回TRUE,或者表示该选项已被提供的东西。

所以我不知道如何识别根本没有提供的选项的区别,并且它被提供但没有值。

如果没有办法区分,InputOption::VALUE_OPTIONAL的用例是什么?

3 个答案:

答案 0 :(得分:5)

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

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

  

没有什么可以禁止您使用可选择接受值的选项创建命令。但是,没有办法可以区分何时使用没有值的选项(命令 - 语言)或者根本没有使用它(命令)。在这两种情况下,为该选项检索的值都将为空。

这完全描述了你的情况。

您无法区分参数何时未通过或已通过但没有值。那是InputOption::VALUE_NONE的目的。

根据您的用例,您可以为console testconsole 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并检查:

  1. 如果值为false该选项不存在
  2. 如果值为null,则选项不存在值
  3. 否则就有其价值
  4. e.g。

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