Я создал две разные консольные команды / контроллеры Yii2.
Пример их вызова
# yii user/create-account
а также
# yii webserver/update-config
После запуска пользователя / создания учетной записи я хочу вызвать webserver / update-config – возможно ли это сделать из Yii кодом? Или мне нужно использовать exec () / system (), чтобы вызвать второй скрипт yii php (я бы предпочел не делать этого).
Любая помощь / понимание будут оценены!
После некоторого рассмотрения способ, которым я решил вызвать один контроллер изнутри другого, был использован метод runAction контроллера (который также рекомендуется разработчикам Yii).
Пример для консольного приложения:
\Yii::$app->runAction('webserver/update-config');
Также возможно передать параметры, используя массив в качестве второго параметра.
Пример для простых параметров:
\Yii::$app->runAction('webserver/update-config', array('oneValue','anotherValue');
Вот пример для именованных параметров:
\Yii::$app->runAction('webserver/update-config', array('servertype'=>'oneSetting', 'serverdir'=>'anotherSettingValue')
Обратите внимание, что это делает вызываемый контроллер частью вызывающего кода. Поэтому, если вызываемый контроллер не работает по какой-либо причине, вся программа выходит из строя. Хорошая обработка ошибок является обязательной. В вызываемом контроллере вы можете установить код ошибки для возврата с помощью возврата .
Пример:
Вызывающая строка кода:
$iExitCode=\Yii::$app->runAction('webserver/update-config', array('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
:
public static function updateConfig() { ... }
В User
контроллере:
public function actionCreateAccount() { ... Webserver::updateConfig(); }
В контроллере Webserver
:
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
Если вы хотите вызвать действие другого контроллера, вы можете использовать метод 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']); }