Вызов команды консоли в команде и получение результата в Symfony2
У меня есть несколько консольных команд в Symfony2, и мне нужно выполнить одну команду из другой команды с некоторыми параметрами.
После успешного выполнения второй команды мне нужно получить результат (в качестве массива, например), а не вывод на экран.
Как я могу это сделать?
Ответы
Ответ 1
Здесь вы можете иметь базовую команду внутри команды. Результатом второй команды может быть json, тогда вам просто нужно декодировать вывод json для извлечения вашего массива.
$command = $this->getApplication()->find('doctrine:fixtures:load');
$arguments = array(
//'--force' => true
''
);
$input = new ArrayInput($arguments);
$returnCode = $command->run($input, $output);
if($returnCode != 0) {
$text .= 'fixtures successfully loaded ...';
$output = json_decode(rtrim($output));
}
Ответ 2
вам нужно передать команду в массиве аргументов и избежать диалога подтверждения в доктрине: fixtures: load вы должны передать --append, а не --force
$arguments = array(
'command' => 'doctrine:fixtures:load',
//'--append' => true
''
);
иначе он выйдет из строя с сообщением об ошибке "Недостаточно аргументов".
Ответ 3
Существует новый класс Output (от v2.4.0), называемый BufferedOutput
.
Это очень простой класс, который возвращает и очищает буферизованный вывод при вызове метода fetch
:
$output = new BufferedOutput();
$input = new ArrayInput($arguments);
$code = $command->run($input, $output);
if($code == 0) {
$outputText = $output->fetch();
echo $outputText;
}
Ответ 4
Я сделал следующее
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\StreamOutput;
$tmpFile = tmpfile();
$output = new StreamOutput($tmpFile);
$input = new ArrayInput(array(
'parameter' => 'value',
));
$command = . . .
$command->run($input, $output);
fseek($tmpFile, 0);
$output = fread($tmpFile, 1024);
fclose($tmpFile);
echo $output;
¡он работает!
Ответ 5
Я понимаю, что старые сообщения и выше ответы решают проблему с небольшим рытьем. В Symfony2.7 у меня была небольшая проблема, которая заставляла его работать, поэтому с предложениями выше я немного выкопал и составил полный ответ здесь. Надеюсь, это будет полезно для кого-то.
Использование команды консоли под консольной командой