Yii::$app->runAction('new_controller/new_action', $params);
我相信这可以用来从一个控制器中调用另一个控制器的动作。
是否有一种方法可以调用位于另一个模块中的控制器动作?
类似于:
Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params);
这可能吗?
Yii::$app->runAction('new_controller/new_action', $params);
我相信这可以用来从一个控制器中调用另一个控制器的动作。
是否有一种方法可以调用位于另一个模块中的控制器动作?
类似于:
Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params);
这可能吗?
是的,你可以这样做。但这表明你的架构存在问题。当控制器包含复杂逻辑时,这是一种不好的做法。
也许你可以将代码的公共部分移动到模型中,并在控制器中调用它作为方法?或者调用$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]);
完成工作
return Yii::$app->runAction('/route/to/other/module/new_controller/new_action', $params);
。 - Insane Skull