Вызов контроллера в другом модуле из другого контроллера
Yii::$app->runAction('new_controller/new_action', $params);
Я считаю, что это можно использовать для вызова действия контроллера из другого контроллера.
Есть ли способ вызвать действие контроллера, которое находится в другом модуле?
Что-то вроде:
Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params);
Это возможно?
3 ответа
Да, вы можете сделать это. Но это указывает на проблемы в вашей архитектуре. Это плохая практика, когда контроллер содержит сложную логику.
Может быть, вы можете переместить общую часть кода в модель и вызвать его в контроллере как метод? Или позвоните по телефону $this->redirect()
вместо Yii::$app->runAction()
? Старайтесь избегать сильной связи модулей.
Обновить:
Например, этот пример кода не очень хорош. Потому что вы не можете писать модульные тесты на логику в действиях без инициализации запроса. Это очень простой пример:
class SampleController extends Controller {
public function actionMyAction() {
// do thomething
return $result;
}
}
class SampleRestController extends Controller {
public function actionMyRestAction() {
return \Yii::$app()->runAction("sample/my-action");
}
}
Но вы можете сделать это:
class MyModel { //
public function generateResult() {
// do thomething
return $result;
}
}
class SampleController extends Controller {
public function actionMyAction() {
return (new MyModel)->generateResult();
}
}
class SampleRestController extends Controller {
public function actionMyRestAction() {
return (new MyModel)->generateResult();
}
}
Здесь вы можете позвонить MyModel::generateResult()
в различных действиях, и вы можете легко написать юнит-тесты для этого метода. И вы можете сделать это без вызова runAction()
,
я не говорю, что runAction()
плохо. Но использование этого метода дает повод задуматься.
Попробуйте использовать это.
Yii::$app->runAction('checksheet/index', ['param1' => $param1, 'param2' => $param2]);
Делает работу
Это возможно с функцией runAction()
в модуле. Проверьте документацию здесь