YII如何处理自定义404错误页面以及其他错误页面

wol*_*ePk 11 php yii http-status-code-404

我想显示404错误页面,因为我在protected/view/system文件夹中创建了error404.php文件.

默认情况下,我有Sitecontroller,它包含错误动作功能,如下所示

public function actionError()
{
    if($error=Yii::app()->errorHandler->error)
    {

        if(Yii::app()->request->isAjaxRequest)
            echo $error['message'];
        else
            $this->render('error', $error);
    }
}
Run Code Online (Sandbox Code Playgroud)

在主配置文件中,它被定义为

    'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
    ),
Run Code Online (Sandbox Code Playgroud)

我的问题是我只需要自定义404页面,其余的错误我需要处理它由sitecontroller的错误函数处理的方式.但我找不到办法做到这一点.如果我想删除'errorAction'=>'site/error',那么它会通过调用显示404错误

        throw new CHttpException(404, 'Page not found');
Run Code Online (Sandbox Code Playgroud)

但这样做我只能看到没有布局的页面,其他自定义错误被视为404,而不是.我多次阅读手册,但我仍然无法解决它.

Bor*_*ski 9

将此代码用于actionError:

$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
    if( $app->request->isAjaxRequest )
        echo $error['message'];
    else
        $this->render( 'error' . ( $this->getViewFile( 'error' . $error ) ? $error : '' ), $error );
}
Run Code Online (Sandbox Code Playgroud)

在views/site中为404错误创建error404.php,为其余创建error.php.

或者您可以在配置中定义param,以获取您希望以不同方式处理的错误并检查错误代码:

$app = Yii::app();
if( $error = $app->errorHandler->error->code )
{
    if( Yii::app()->request->isAjaxRequest )
        echo $error['message'];
    else    
        $this->render( 'error' . ( in_array( $error, $app->params[ 'customErrorPages' ] ) ? $error : '' ), $error );
}
Run Code Online (Sandbox Code Playgroud)

错误处理程序的工作方式如下:当httpexception出现时,组件将检查errorAction属性中是否有任何值,如果有,则运行此控制器的操作.如果errorAction属性没有设置值,将显示系统文件夹中的错误视图.因此,无需在系统视图文件夹和控制器的视图文件夹中混合错误视图.