在beforeAction中渲染视图时,在Yii中获取“已发送标头”错误

时间:2018-05-15 16:01:39

标签: yii yii2

我已经阅读过关于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()的结果是否为假。

1 个答案:

答案 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) - 省略它会导致意外且难以调试的行为。