【问题标题】:How to identify if an option was supplied without a value with Symfony Console?如何使用 Symfony 控制台识别是否提供了没有值的选项?
【发布时间】:2016-09-09 08:04:45
【问题描述】:

使用 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-&gt;getOption() 将在前两种情况下返回 NULL。我希望在第二种情况下它会返回TRUE,或者表明提供了选项的东西。

所以我不知道如何识别根本没有提供选项和提供但没有值的区别。

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

【问题讨论】:

    标签: php symfony symfony-console


    【解决方案1】:

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

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

    例如

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

    【讨论】:

    • 这行得通,并且比当前接受的答案更安全,因为此方法可以正确使用快捷方式。
    • 是的,对于较新版本的 Symfony,这绝对是首选解决方案。
    • 自 Symfony 4.4 起不再正确。无论我是否通过选项,除非指定,否则该值始终为 NULL。
    【解决方案2】:

    您将两件事结合在一起。没有值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)
    

    【讨论】:

    • 感谢您的确认。它仍然提出了一个问题(不是在你,而是在一般情况下)为什么这个功能存在? IE。如果命令只能在选项具有值时识别提供的选项,为什么要为选项提供具有可选值的能力。有人如何充分利用它?
    • 简单 - 开关! command 将简单地运行它,command --verbose 将运行它详细。
    【解决方案3】:

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

    在查看Symfony\Component\Console\Input\InputInterface 之后,我发现了getParameterOption() 方法,它可以区分未使用的选项、使用的不带值的选项和使用的带值的选项。

    在命令的configure()方法中:

    $this-&gt;addOption('test', null, InputOption::VALUE_OPTIONAL);

    在命令的execute()方法中:

    $test = $input-&gt;getOption('test'); $rawTest = $input-&gt;getParameterOption('--test');

    为给定的命令行生成以下值:

    &gt; bin/console some:cmd

    $test => null

    $rawTest => false

    &gt; bin/console some:cmd --test

    $test => null

    $rawTest => null

    &gt; bin/console some:cmd --test=something

    $test => "something"

    $rawTest => "something"

    【讨论】:

      猜你喜欢
      • 2015-10-16
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多