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