Yii2 console command runner
Another implementation of Yii2 console command runner. At the time of writing this, it differs from
vova07/yii2-console-runner-extension and [toriphes/yii2-console-runner] (https://github.com/toriphes/yii2-console-runner) in that it doesn't require shell_exec to be enabled on the server., (*1)
Typical usage would be to run migrate or other of your console application's commands from web application's controller's action., (*2)
Installation
The preferred way to install this extension is through composer., (*3)
Either run, (*4)
$ composer require tebazil/yii2-console-runner
or add, (*5)
"tebazil/yii2-console-runner": "*"
to the require section of your composer.json file., (*6)
Basic usage
First you initialize the runner., (*7)
$runner = new \tebazil\runner\ConsoleCommandRunner();
Then you run as many commands as you need:, (*8)
$runner->run('migrate');
$runner->run('migrate\create', ['insert_test_id','interactive'=>false]);
After running each command, you may collect get the exitCode and/or output for the last command., (*9)
$output = $runner->getOutput();
$exitCode = $runner->getExitCode();
How it works
On initialization, the runner creates a new console application, then it returns Yii::$app to the application currently executed. When running the command, runner will first replace the Yii::$app with the "child" console application, run the command, and replace Yii::$app back with the parent application.
The result is that in console commands you have console application's Yii::$app, and between the runs Yii::$app is your "parent" application, as it was intended., (*10)
Advanced usage
You can optionally pass the $config (path or array) to the ConsoleCommandRunner::__construct method, so you can alter console application's configuration on the fly. You might also want to create several runners with different configured applications - each will stick to it's own application, and will respore original Yii::$app between runs., (*11)
Known issues
Currently only echo output can be retrieved with getOutput, because standart ob_start/ob_get_clean combination is used to capture the output. If output is being written directly to stdout or stderr, it won't be captured., (*12)