我已经阅读过关于Yii2的处理程序的内容,而且我没有掌握如何正确使用它们。
基本上在我的SiteController
中,我有:
class SiteController extends \app\components\Controller
{
public function beforeAction($action)
{
// Makes some checks and if it's true, will render a file and stop execution of any action
if (...)
echo $this->render('standby');
return false;
}
return true;
}
// All my other actions here
}
这似乎运行良好并且停止执行,但是我得到render()
行的“Headers already sent”,好像它正在进行重定向。
如果我写Yii::$app-end()
而不是return false
,则会发生同样的事情。
如果我写exit();
而不是return false
,则没有异常显示,但调试面板未显示,因为Yii未正确终止。
我尝试删除echo $this->render(..)
并且它导致一个空页面,没有任何重定向,这似乎只是Yii抱怨我回应来自Controller的东西。
当然,我无法返回render()
的结果或返回true
,因为它会执行页面的操作,我试图避免并在此结束。
我知道在beforeAction()
触发器EVENT_BEFORE_ACTION
中返回false,但我看不出我应该在哪里使用它。 events documentation并没有真正帮助我。
那么有没有办法显示“待机”视图,阻止执行其他操作并避免错误消息从Controller
回显?
请注意,我正在努力完成这项工作,而不必在每个操作方法中重复代码,以检查beforeAction()
的结果是否为假。
答案 0 :(得分:8)
由于Yii 2.0.14您无法在控制器中回显 - 必须通过操作返回响应。如果您想在beforeAction()
中生成回复,则需要设置Yii::$app->response
组件而不是回显内容:
public function beforeAction($action) {
// Makes some checks and if it's true, will render a file and stop execution of any action
if (...) {
Yii::$app->response->content = $this->render('standby');
Yii::$app->response->statusCode = 403; // use real HTTP status code here
return false;
}
return parent::beforeAction($action);
}
不要忘记致电parent::beforeAction($action)
- 省略它会导致意外且难以调试的行为。