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

Php YII如何处理自定义404错误页面以及其他错误页面,php,yii,http-status-code-404,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)

我想显示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的错误函数处理的方式来处理。但我找不到一个方法来做到这一点。如果假设我从config main中删除'errorAction'=>'site/error',那么它会通过调用

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

但这样做,我只能看到没有布局的页面,其他自定义错误被视为404相同,而不是。这本手册我读了很多遍,但我还是不能解决它

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

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

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

链接

示例

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

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

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

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

将此代码用于actionError:

在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 );
}

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

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


因为error是一个数组。

您的意思是在error视图中提供if-then-else条件,然后相应地添加部分视图?(我认为如果我在系统目录中使用error404.php,它应该是自动的。??是的。我不确定它是否与自动一起工作…请参阅更新。在教程和文档更新中,它没有足够的信息。我需要处理默认错误以及自定义404或405页的自定义错误。为此,我添加了error404.php在我的系统目录中,为了处理默认错误,我在新控制器systemcontroller中使用了内部配置文件。但我不知道如何使用htaccess来实现这一点,但我正在学习YII,我的系统要求我必须通过YII来使用它。如果您知道如何使用YII来实现这一点,请指教n它的教程非常模糊,没有给出更广泛的观点。帮帮我,伙计们……我不得不将它改为
if($error=Yii::app()->errorHandler->error['code'])
error->code
给了我错误。同时
getViewFile
也给了我这个错误。
CWebApplication及其行为没有名为“getViewFile”的方法或闭包(/Applications/XAMPP/xamppfiles/htdocs/wm/common/lib/yii/framework/base/CComponent.php:266)
有什么想法吗?
error->code
的错误消息是
注意:在第48行的/Applications/XAMPP/xamppfiles/htdocs/wm/backend/controllers/SiteController.php中尝试获取非对象的属性你是对的。app类中没有getViewFile方法。应该调用controller的方法:$this->getViewFile(…)
$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 );
}
Yii::app()->errorHandler->error['code']