2

コマンドが実行されたときに値を要求するsymfonyコンソールパッケージで遊んでいますpublic function execute(...)

ユーザーに何かを求めようとするとき、独自のカスタム スタイルを作成していない場合、それを行うには 2 つの異なる方法があると考えました。a) 質問ヘルパーを使用する、b) 定義済みのスタイルを使用する、これにより、単純な実行SymfonyStyle
を使用して開始し、値を指定しないとエラーが発生し続けました。代わりにヘルパーを使用して質問を直接作成すると、空の値を与えることができます。 SymfonyStyleask("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と、クラスが言うように、それは単なるスタイリングであるため、検証とはまったく違いがないように見えます。それで、これら2つの違いである何かが欠けていますか?SymfonyStyle空の回答をまったく受け入れるようにすることは可能ですか?

4

3 に答える 3

0

私の解決策:

$question = new Question(
    "Please insert a value",
    false
);

$userInput = $io->askQuestion($question);


$finalValue = $userInput ? $userInput : null;

ユーザーが何も挿入しない場合、最後の行は実際に(の代わりに) $finalValueasにする必要があります。nullfalse

于 2016-10-20T12:27:12.977 に答える
0

これは私がこの場合に使用するものです: (これはクラス where の抜粋です$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);
    }
于 2016-08-17T01:59:08.317 に答える
0

質問が偽の応答を受け取る可能性はあるが、null の応答は得られないことを理解している限り、これは実際には非常に単純です。SymfonyStyle を使用すると、これを 1 行で実行できます。

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

もちろん、これは、偽の応答を必要としないことを前提としています。

于 2018-11-12T09:04:52.023 に答える