有没有办法从Yii2中的beforeAction()方法动态调用任意操作?
答案 0 :(得分:1)
覆盖Controller中的BeforeAction事件
public function beforeAction($action){
if(Yii::$app->user->isGuest) {
return $this->redirect(['index']);
}
parent::beforeAction($action);
}
答案 1 :(得分:0)
您可以通过调用beforeAction()
内的操作,配置响应并返回false
来执行此操作 - 它将阻止执行请求的操作。
public function beforeAction($action){
if ($this->someCondition()) {
$response = $this->actionMySecondAction();
if (!$response instanceof \yii\web\Response) {
Yii::$app->response->data = $response;
}
return false;
}
return parent::beforeAction($action);
}
但这是一种黑客行为,你可能会遇到一些奇怪的副作用。您应该重新考虑您的架构以避免此类解决方案。如果您有多步表单,则可以使用一个URL和一个操作 - 分离步骤以分离方法并根据表单状态调用所需方法,而不是URL。无需使用此类黑客,您将避免在http://localhost/form/third-step
显示第二步。
答案 2 :(得分:-1)
如果您未在beforeAction中完成该应用,它将继续执行操作并仅在返回操作后执行重定向。
要避免此行为,您应该在beforeAction方法中结束应用,并且不要使用带有重定向的返回:
public function beforeAction($action){
if ($some_conditions && $this->getRoute() != 'site/index') {
$this->redirect(['site/index']);
Yii::$app->end();
}
return parent::beforeAction($action);
}