Intereting Posts
Как конвертировать `if condition` в` switch` метод Оптимизированный метод сравнения IP-адресов с подстановочными знаками в PHP? Как использовать инъекцию зависимостей на Yii2 Ограничение позиций корзины в одной и той же категории продуктов Функция ereg_replace () устарела – как очистить эту ошибку? Регулярное выражение для проверки того, являются ли два первых слова одинаковыми onclick в php echo с ошибкой неверный неожиданный токен PHP cookie установлен на второй странице обновления Symfony 3 – данные модели модели теряют значения свойств, которые не представлены полями PHP конвертирует hex в байт Как добавить PHP-код / ​​файл в файлы HTML (.html)? Показать индексы в таблице MySQL Как показать кнопку «плюс» при удалении изображения? PHP: как отсортировать значения массива в алфавитном порядке? Самый эффективный способ получить следующую букву в алфавите с помощью PHP

Yii2 – Вызов команды консоли Yii из другой команды консоли?

Я создал две разные консольные команды / контроллеры 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']); }