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

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并检查:

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

例如

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

$force = $input->getOption('force') !== false;
Run Code Online (Sandbox Code Playgroud)


Jas*_*ler 7

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


mar*_*tin 5

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

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

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

这完全描述了你的情况.

您无法区分何时未传递参数或传递参数但没有值.这就是InputOption::VALUE_NONE为此而做的.

根据您的用例,您可以将在使用的参数提供一个默认值console testconsole test --option情况.

另请注意,addOption将第二个参数作为参数作为参数.

public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null)
Run Code Online (Sandbox Code Playgroud)