Вызов команды консоли в команде и получение результата в 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 у меня была небольшая проблема, которая заставляла его работать, поэтому с предложениями выше я немного выкопал и составил полный ответ здесь. Надеюсь, это будет полезно для кого-то.

Использование команды консоли под консольной командой