Консоль Symfony «спроси» не будет принимать пустые значения

Я играю с консольным пакетом Symfony, где заставляю его запрашивать значение при выполнении команды, иначе public function execute(...),

Когда я пытался что-то спросить у пользователя, я понял, что это два разных способа сделать это, если вы не создаете свой собственный стиль. а) Использование помощника по вопросам, б) использование предопределенных стилей, настоящим 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 вообще принимать пустые ответы?

2

Решение

Вот что я использую в этом случае:
(это выдержка из класса, где $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);
}
0

Другие решения

мое решение:

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

$userInput = $io->askQuestion($question);$finalValue = $userInput ? $userInput : null;

последняя строка нужна, чтобы на самом деле сделать $finalValue как null (вместо false) когда пользователь ничего не вставляет.

0

На самом деле это довольно просто, если вы понимаете, что вопрос может получить ложный ответ, но не нулевой ответ. Используя SymfonyStyle, это можно сделать в одной строке:

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

Конечно, это предполагает, что вам не потребуется ложный ответ.

0
По вопросам рекламы [email protected]