问题 YII如何处理自定义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);
    }
}

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

    'errorHandler'=>array(
        // use 'site/error' action to display errors
        'errorAction'=>'site/error',
    ),

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

        throw new CHttpException(404, 'Page not found');

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


12523
2017-08-05 10:05


起源



答案:


使用此代码 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 );
}

在views / site中创建 error404.php 对于404错误和 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 );
}

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


9
2017-08-05 13:55



我不得不改变它 if( $error = Yii::app()->errorHandler->error['code'] )  error->code 给了我错误。也 getViewFile 给了我这个错误。 CWebApplication and its behaviors do not have a method or closure named "getViewFile". (/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266) 有任何想法吗? - user2636556
错误消息 error->code 是 Notice: Trying to get property of non-object in /Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php on line 48 @Boris - user2636556
你是对的。 app类中没有getViewFile方法。应该调用controler的方法:$ this-> getViewFile(...) - Boris Belenski


答案:


使用此代码 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 );
}

在views / site中创建 error404.php 对于404错误和 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 );
}

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


9
2017-08-05 13:55



我不得不改变它 if( $error = Yii::app()->errorHandler->error['code'] )  error->code 给了我错误。也 getViewFile 给了我这个错误。 CWebApplication and its behaviors do not have a method or closure named "getViewFile". (/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266) 有任何想法吗? - user2636556
错误消息 error->code 是 Notice: Trying to get property of non-object in /Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php on line 48 @Boris - user2636556
你是对的。 app类中没有getViewFile方法。应该调用controler的方法:$ this-> getViewFile(...) - Boris Belenski


每当发生错误时,都会调用siteController中的操作错误。您可以在该操作中自定义错误路由,您可以执行以下操作:

if(404==Yii::app()->errorHandler->error->code){
     //go to custome error page
else
   //code default error.php

3
2017-08-05 10:07



你的意思是在错误视图中提供if else else条件然后相应地添加部分视图? (我认为如果我在系统目录中使用error404.php它应该是自动的。??? - wolvorinePk
是的..我不确定它是否适用于自动...查看更新。 - bingjie2680
在教程和文档更新中,它没有足够的信息。我需要处理自定义404或405页面的默认错误以及我自己的自定义错误。为此,我在我的系统目录中添加了error404.php,并处理默认错误,我在配置文件中使用新控制器systemcontroller。但有点不按我想要的方式工作 - wolvorinePk


你不能用.htaccess做到这一点吗?我个人创建一个“错误”文件夹,其中包含所有包含错误消息的html php文件,并修改.htaccess以在遇到错误时调用这些页面。

链接

http://www.javascriptkit.com/howto/htaccess2.shtml

http://www.addedbytes.com/for-beginners/error-documents-for-beginners/

例子

在要调用错误页面的目录中创建.htaccess文件,并在文本文件中写入以下行:

ErrorDocument 404     /404.html

假设在同一目录中有一个名为404.html的页面,当生成404页面未找到错误时,将调用404.html页面。

同样适用于其他错误代码:

ErrorDocument 500     /500error.html

假设创建了500错误,并且同一目录中存在500error.html文件。


1
2017-08-05 10:27



我知道要使用htaccess这样做,但我正在学习YII,我的系统要求我必须通过yii使用它。如果你有任何想法如何使用yii,因为即使它的教程非常模糊,并没有提供更广泛的观点。帮帮我们...... - wolvorinePk


在最新版本的框架中(我正在使用1.14)使用:

Yii::app()->errorHandler->error['code']

因为 错误 是一个数组。


1
2017-08-18 08:22