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']);
}