【问题标题】:Symfony console "ask" won't accept empty valuesSymfony 控制台“询问”不接受空值
【发布时间】:2016-01-18 03:34:07
【问题描述】:

我正在使用 symfony 控制台包,我让它在执行命令时请求一个值,也就是 public function execute(...)

当试图向用户询问某事时,我认为如果您不制作自己的自定义样式,这是两种不同的方法。 a)使用问题助手,b)使用预定义的样式,特此SymfonyStyle
我开始使用SymfonyStyle 运行一个简单的ask("question here"),如果我没有给它一个值,它就会一直给我错误。如果我改为使用帮助程序,直接创建问题,那么它将允许我给它一个空值。

这里有一些例子:

# SomeCommand.php
namespace What\A\Command;

use Symfony\Component\Console\Question\Question;
use Symfony\Component\Console\Style\SymfonyStyle;

// ...
public function execute(InputInterface $input, OutputInterface $output)
{
    // ...

    // With the helper, which allows empty answer
    $helper = $this->getHelper('question');
    $q = new Question('Question here');

    dump($helper->ask($input, $output, $q));
    // Output:
    // Question here
    // null


    // With SymfonyStyle which DOES NOT allow empty answer
    $io = new SymfonyStyle($input, $output);
    dump($io->ask("Question here"));
    // Output:
    // Question here:
    // [ERROR] A value is required.
}

查看SymfonyStyle 的文件,看起来它在验证方面并没有太大的不同,正如班级所说,它只是样式。 那么有什么我遗漏的东西是这两者之间的区别吗?是否有可能实现让SymfonyStyle 完全接受空答案?

【问题讨论】:

  • 是的,对于 SymfonyStyle,输入似乎是强制性的,而不是使用默认值。检查 SymfonyQuestionHelper 类
  • 啊,没有注意到它没有直接使用 Question 类,感谢您指导我。我发现SymfonyQuestionHelper 需要一个有效的值。现在我知道如何继续让它为空,但也保持相同的风格而不破坏 DRY :) 谢谢,@Matteo!
  • 嗨@Morten,不客气!
  • 不得不撤回我关于使用SymfonyStyle而不破坏DRY的声明...所有属性和一些方法都给出private而不是protected,所以我不能“窃取”它在不违反 DRY 原则的情况下..

标签: php symfony symfony-console


【解决方案1】:

这是我在这种情况下使用的: (这是$this->io= new SymfonyStyle($input, $output) 类的摘录)。

在我的用例中,占位符不太可能出现在用户输入中。

public function askAllowEmpty($question, $default)
    {
        $placeholder = \uniqid("placeholder");
        $field = $this->io->ask($question, $default, function($string) use ($placeholder) {
               return (null == $string)? $placeholder : $string;
        });
        return str_replace($placeholder, null, $field);
    }

【讨论】:

    【解决方案2】:

    我的解决方案:

    $question = new Question(
        "Please insert a value",
        false
    );
    
    $userInput = $io->askQuestion($question);
    
    
    $finalValue = $userInput ? $userInput : null;
    

    当用户没有插入任何内容时,需要最后一行将$finalValue 实际设为null(而不是false)。

    【讨论】:

      【解决方案3】:

      这实际上非常简单,只要您了解问题可以得到错误响应但不能得到空响应。使用 SymfonyStyle,这可以在一行中完成:

      $answer = $this->io->ask("Ask a question?", false) ?: null);
      

      当然,这是假设您不需要虚假回复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 2022-01-22
        • 1970-01-01
        • 2019-07-17
        相关资源
        最近更新 更多