Я играю с консольным пакетом 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
вообще принимать пустые ответы?
Вот что я использую в этом случае:
(это выдержка из класса, где $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);
}
мое решение:
$question = new Question(
"Please insert a value",
false
);
$userInput = $io->askQuestion($question);$finalValue = $userInput ? $userInput : null;
последняя строка нужна, чтобы на самом деле сделать $finalValue
как null
(вместо false
) когда пользователь ничего не вставляет.
На самом деле это довольно просто, если вы понимаете, что вопрос может получить ложный ответ, но не нулевой ответ. Используя SymfonyStyle, это можно сделать в одной строке:
$answer = $this->io->ask("Ask a question?", false) ?: null);
Конечно, это предполагает, что вам не потребуется ложный ответ.