@ugin_root

Как выполнить команду программно и автоматически ответить на вопросы?

Внутри своей команды нужно вызвать другие и автоматически ответить на задаваемые вопросы. Сейчас это делается так:
$this->getApplication()->get('doctrine:migrations:migrate')->run($input, $output);

В итоге вопросы задаются самой консолью и на них приходится каждый раз отвечать. Мне интересно есть ли способ ответить на вопросы автоматически.
Консоль каждый раз меня спрашивает:
WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)

И мне каждый раз приходится писать "y". Команда приведена в качестве примера, на самом деле выполняются другие команды.
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
@Flying
Если речь идёт о частном случае данной команды - то ответ довольно прост и легко ищется в исходных текстах. Вот как проверяется возможность запуска команды миграции, как видно - здесь используется метод canExecute(), посмотрев в который можно заметить что он контролируется флагом --no-interaction. Более того, банально вызвав help по этой команде можно было бы увидеть ответ на свой вопрос написанный прямым текстом:
Or you can also execute the migration without a warning message which you need to interact with:

    bin/console doctrine:migrations:migrate --no-interaction


Если же речь идёт об общем подходе к тому как запускать консольные команды которые требуют пользовательского ввода - то здесь ответ довольно находится в документации Symfony. Если посмотреть в исходные тексты ConsoleTester о котором говорится в этом разделе, то видно что основная идея - использование специального input'а. Таким образом решение становится довольно простым:
  1. Получаем и клонируем Kernel
  2. Создаём новый консольный Application
  3. Создаём и конфигурируем ArrayInput
  4. Запускаем приложение с нужным нам input'ом

Весь основной код для этого можно, очевидным образом, подсмотреть в bin/console самой Symfony.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы