Yii2-вызов команды консоли Yii из другой команды консоли?
Я создал две разные консольные команды/контроллеры Yii2.
пример назовем их
# yii user/create-account
и
# yii webserver/update-config
после запуска user/create-account я хочу вызвать webserver / update-config - возможно ли это сделать из Yii кодом? Или мне нужно использовать exec () / system () для внешнего вызова второго скрипта Yii php (я бы предпочел этого не делать).
любая помощь / понимание будут оценены!
3 ответов
после некоторого рассмотрения я решил вызвать один контроллер изнутри другого, используя метод runAction контроллера (который также рекомендуется разработчиками Yii).
пример для консольного приложения:
\Yii::$app->runAction('webserver/update-config');
также можно передать параметры, используя массив в качестве второго параметра.
пример для простых параметров:
\Yii::$app->runAction('webserver/update-config', ['oneValue', 'anotherValue'];
вот пример для named параметры:
\Yii::$app->runAction('webserver/update-config', [
    'servertype' => 'oneSetting', 
    'serverdir'  => 'anotherSettingValue'
]);
обратите внимание, что это делает вызываемый контроллер частью вызывающего кода. Поэтому, если вызываемый контроллер по какой-то причине терпит неудачу, вся программа терпит неудачу. Хорошая обработка ошибок является обязательным. В вызываемом контроллере вы можете установить код ошибки для возврата с помощью возвращение.
пример:
вызывающая строка кода:
$iExitCode = \Yii::$app->runAction('webserver/update-config', ['oneValue', 'anotherValue'];
называется контроллер:
<?php
namespace app\commands;
use yii\console\Controller;
/**
* Webserver related functions
*/
class WebserverController extends Controller {
    public function actionUpdateConfig($oneValue, $anotherValue) {
        // Code that does something
        if ($success) return 0;
        else          return 1;
    }
}
?>
вызов одного действия из другого (даже внутри одного контроллера) не очень хорошая практика и ясно. Я предлагаю другой подход.
переместить обновление конфигурации веб-сервера логики вне Webserver контроллер, например, поместите его в какой-либо компонент / помощник.
затем вы можете вызвать этот метод из любого места, в частности, в контроллере пользователя и контроллере веб-сервера.
пример. В Webserver компоненты:
public static function updateConfig()
{
    ...
}
на User контроллер:
public function actionCreateAccount()
{
    ...
    Webserver::updateConfig();
}
на :
public function actionUpdateConfig()
{
    Webserver::updateConfig();
}
Я думаю, что это более многоразовые и понятно.
Вариант 1
вы можете запустить одно действие контроллера из другого действия. Например,
public function actionCreateAccount() {
    // something
}
public function actionUpdateConfig() {
    // something
}
public function actionComplex() {
    $this->actionCreateAccount();
    $this->actionUpdateConfig();
}
или
public function actionCreateAccount() {
    // something
    $this->actionUpdateConfig();
}
public function actionUpdateConfig() {
    // something
}
Вариант 2
если вы neet вызвать действие другого контроллера, вы можете использовать run () метод консольного контроллера:
например, действие в WebmasterController:
public function actionUpdateConfig($param1, $param2)
{
    echo $param1 . '/' . $param2 . PHP_EOL;
}
действие в UserController:
public function actionCreateAccount()
{
    echo 'test: ';
    $this->run('webmaster/update-config', ['do', 'it']);
}
