Yii2整站的统一错误处理控制器设计

一、需求描述:

在Yii2开发中会有各种各样的错误出现,除了YII_DEBUG为真状态时的调试页面而外(Debugger喜欢的再没谁了!),更需要一个对终端用户统一显示的,更加友好的错误提示页面。

二、解决思路:

定义一个CommonController统一处理整站的错误提示信息,创建新的Controller时继承自CommonController就可以了,在需要显示错误信息的地方调用CommonController的公共方法即可,样式设计上则参照了Ecshop的跳转链接列表样式。在CommonController中除了错误信息(error)提示之外,还有普通信息(info)的显示处理,操作成功(success)的提示。话不多说,上代码:

三、源代码:

1、定义CommonController

文件位置:D:\phpwork\advanced\frontend\controllers\CommonController.php

<?php
namespace frontend\controllers;
use yii\web\Controller;
class CommonController extends Controller{
   /*
     * 操作成功显示提示信息
     * @param string $info,显示的信息提示
     * @param array $url,二维数组,将要跳转的链接,格式:[[urlText1,url1],[urlText2,url2]......]
     * @param int $jumpseconds,自动跳转到第一个链接的秒数,-1:不自动跳转;0:当即跳转;大于0的整数:信息显示的秒数
     * @return exit
    * sample:
    * return $this->success('Submit success,Thank you!',[['首页','/'],['购物车','/shopping-cart/index']],3);
     * */
    public function success($info,$url=[],$jumpSeconds=-1){
        if(!empty($url)&&empty($jumpSeconds)){
            return $this->redirect($url[0]);
        }else{
            $this->layout='empty';
            return $this->render('@app/views/success',[
                'info'=>$info,
                'url'=>$url,
                'jumpSeconds'=>$jumpSeconds,
            ]);
        }
    }
    /*
     * 操作失败显示提示信息
     * @param string $info,显示的信息提示
     * @param array $url,二维数组,将要跳转的链接,格式:[[urlText1,url1],[urlText2,url2]......]
     * @param int $jumpseconds,自动跳转到第一个链接的秒数,-1:不自动跳转;0:当即跳转;大于0的整数:信息显示的秒数
     * @return exit
     * */
    public function error($info,$url=[],$jumpSeconds=-1){
        if(!empty($url)&&empty($jumpSeconds)){
            return $this->redirect($url[0]);
        }else{
            $this->layout='empty';
            return $this->render('@app/views/errormsg',[
                'info'=>$info,
                'url'=>$url,
                'jumpSeconds'=>$jumpSeconds,
            ]);
        }
    }
    /*
     * 调用信息提示页面
     * @param string $info,显示的信息提示
     * @param array $url,二维数组,将要跳转的链接,格式:[[urlText1,url1],[urlText2,url2]......]
     * @param int $jumpseconds,自动跳转到第一个链接的秒数,-1:不自动跳转;0:当即跳转;大于0的整数:信息显示的秒数
     * @return exit
     * */
    public function info($info,$url=[],$jumpSeconds=-1){
        if(!empty($url)&&empty($jumpSeconds)){
            return $this->redirect($url[0]);
        }else{
            $this->layout='empty';
            return $this->render('@app/views/info',[
                'info'=>$info,
                'url'=>$url,
                'jumpSeconds'=>$jumpSeconds,
            ]);
        }
    }
    /*
     * 显示model数据验证失败错误信息(专用)注意:仅在调试模式时显示
     * 示例: $this->errorDisplay($model->getErrors());
     * @param array $errorArray,错误信息数组,样例:$errorArr=[['Author is empty!']];
     * @return exit
     * */
    public function errorDisplay($errorArray){
        $errorstr="";
        if(YII_DEBUG&&$errorArray&&is_array($errorArray)){
            foreach ($errorArray as $k=>$error) {
                if(is_array($error)){
                    $errorstr.=implode("\n\n",$error)."\n\n";
                }else{
                    $errorstr.="Have Error\n\n";
                }
            }
        }
        if(!$errorstr){
            $errorstr="Have error!\n\n";
        }
        return $this->error($errorstr);
    }
}

2、定义错误视图文件errormsg.php,还有两个视图文件:success.php和view.php与此类似,可参照自行修改。

文件位置:D:\phpwork\advanced\frontend\views\errormsg.php

<?php

/* @var $this yii\web\View */
/* @var $name string */
/* @var $message string */
/* @var $exception Exception */

use yii\helpers\Html;
$this->title ="MyWeb";
?>
<div class="container">
    <div class="hint-main hint-error">
        <h1></h1>
        <h2>ERROR INFORMATION</h2>
        <h3><?= nl2br(Html::encode($info)) ?></h3>
        <?php
        $str='';
        if(!empty($url)){
            $str.='<h4>You can select:';
            foreach($url as $item){
                $str.="<a href='".$item[1]."'>".$item[0]."</a>";
            }
            if($jumpSeconds>=0){
                $str.="<BR><BR>".Yii::t('app','After ').$jumpSeconds.Yii::t('app',' seconds').Yii::t('app',' will jump to')." '<a href='".$url[0][1]."'>".$url[0][0]."</a>'<meta http-equiv=refresh content=".$jumpSeconds.";url=".$url[0][1].">";
            }
            $str.='</h4>';
        }
        echo $str;
        ?>
    </div>
</div>

3、使用CommonController中公共方法error()进行错误提示

文件位置:D:\phpwork\advanced\frontend\controllers\SiteController.php

namespace frontend\controllers;
class SiteController extends CommonController{
    public function actionDetail($id){
    $query = new \yii\mongodb\Query;
    $article = $query->select(['title', 'content'])
        ->from('article')
        ->where(['_id' => $id])
        ->limit(1)
        ->one();
    if($article){
        $this->render("index",['article'=>$article]);
    }else{
        //在需要显示错误信息的地方直接调用error()方法即可。
        return $this->error('你查找的文章不存在!',[['Home','/']],3);
        echo "error()方法之后的内容将不再显示出来!";
    }
    }
}

(全文完)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • error code(错误代码)=2000是无效的像素格式。error code(错误代码)=2001是指定的驱动...
    Heikki_阅读 1,796评论 0 4
  • error code(错误代码)=0是操作成功完成。error code(错误代码)=1是功能错误。error c...
    Heikki_阅读 3,379评论 1 9
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,750评论 2 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • 错误:1000 SQLSTATE: HY000 (ER_HASHCHK)消息:hashchk 错误:1001 SQ...
    灼灼2015阅读 23,528评论 0 6