Symfony 3.4 Обработка вопросов с несколькими входами - PullRequest
2 голосов
/ 24 мая 2019

Я прочитал документацию и попробовал несколько примеров, но, похоже, не могу получить компонент процесса Symfony, который позволял бы мне отвечать на несколько вопросов по мере их возникновения. Я знаю ответы заранее и хотел бы просто подать их в виде строки.

Команда, которую я хочу запустить в процессе, выглядит примерно так:

$ introduce
$ > What is your name? 
$ Michael
$ > How old are you?
$ 36
$ > Are you having a good day?
$ Yes
$ Doing lots of stuff now.
$ Info recorded. Thank you!

Тупо простой пример. Команда задает три вопроса и ожидает ответа на каждый вопрос. Затем (моя настоящая команда) начинается процесс long .

Я пробовал варианты

$process = new Process('introduce', MY_DIR);
$process->setTimeout(null);

$inputs = "Michael\n36\nYes\n";
$process->setInput($inputs);
$process->enableOutput();

$process->start();

и

$process = new Process('introduce', MY_DIR);
$process->setTimeout(null);

$inputs = new InputStream();
$inputs->write("Michael");
$inputs->write("36");
$inputs->write("Yes");

$process->setInput($inputs);
$process->enableOutput();

$process->start();
$inputs->close()

и

$process = new Process('introduce', MY_DIR);
$process->setTimeout(null);

$inputs = new InputStream();
$process->setInput($inputs);
$process->enableOutput();
$process->start();

$inputs->write("Michael");
$inputs->write("36");
$inputs->write("Yes");
$inputs->close();

А затем, чтобы дождаться его окончания:

$running = true;
while($running) {
    if (!$process->isRunning()) {
        if (!$process->isSuccessful()) {
            throw new Exception($process->getErrorOutput());
        }

        $running = false;
    }

Я знаю, что могу использовать ->wait(), но в моем реальном приложении я запускаю несколько экземпляров параллельно и не могу позволить одному блоку завершить работу других. Итак, я добавляю процессы в массив и сбрасываю их по завершении. Когда массив пуст, я вырываюсь из циклов и продолжаю работать с программой.

Итак, что я делаю не так? Как я могу отправить предопределенный ввод в процесс, чтобы он мог ответить на последовательные вопросы и затем позволить процессу продолжиться ?

...