ThinkPHP 5.0/5.1 自定义404、500页面 及 Ajax信息返回

文章目录

简要说明

  • 灵活配置404、500页面
  • 区分Ajax请求、Get请求返回

逻辑设计

GET: 404显示404页面,其余异常均显示500页面
Ajax: 异常统一返回Code = 400,Message = Server exception
错误日志: 除404外,均写入错误日志

配置过程

查看开发文档 异常处理(5.0) / 异常处理(5.1) 章节。

按照官方推荐,在config/app.php(5.1) / application/config.php(5.0) 文件中,自定义异常页面模板 及 配置异常处理文件:

'http_exception_template'    =>  [
    // 定义404错误的模板文件地址
    404 =>  Env::get('app_path') . '404.html',
]

// 异常页面的模板文件
//'exception_tmpl'         => Env::get('think_path') . 'tpl/think_exception.tpl',
'exception_tmpl'         => Env::get('app_path') . '500.html',
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle'       => '\\app\\common\\exception\\Http',

app\common\exception\Http.php

<?php

/**
 * AppName
 * ============================================================================
 * 版权所有 ****,并保留所有权利。
 * ----------------------------------------------------------------------------
 * 异常处理
 * GET: 404显示404页面,其余异常均显示500页面
 * POST: 异常统一返回Server exception
 * 错误日志: 除404外,均写入错误日志
 * ============================================================================
 * Author: 暴走的西瓜
 */

namespace app\common\exception;

use Exception;
use think\exception\Handle;
use think\exception\HttpException;

class Http extends Handle
{
    public function render(Exception $e)
    {
        if (Config('app.app_debug')) {
            Config('exception_tmpl', env('think_path') . 'tpl/think_exception.tpl');
            return parent::render($e);
        }

        if (!$e instanceof HttpException) {
            $errorLog = '';
            $errorLog .= "errorCode:500";
            $errorLog .= "\nerrorMessage:".$e->getMessage();
            $errorLog .= "\nip:".request()->ip();
            $errorLog .= "\nurl:".request()->url(true);
            $errorLog .= "\nmethod:".request()->method();
            !empty(request()->param()) ? $errorLog .= "\nparam:".json_encode(request()->param()) : null;
            if (request()->isAjax()) $errorLog .= "\nisAjax:true";
            // write log
            logs($errorLog);
        }

        // Ajax提交,统一返回Server exception
        if (request()->isAjax()) return jsonFailed('Server exception');

        return parent::render($e);
    }
}

以上代码及配置说明:

  • 验证app_debug是否开启。开启:正常返回错误调试信息;关闭:捕获异常,对应处理;
  • 验证是否非404,本文设计除 404 外,均写出错误日志;
  • 验证是否为 Ajax 提交,返回 Code = 400, Message = 'Server exception'

扩展信息

由于官方5.0 / 5.1 版本Log不支持自定义文件夹。这里我们在application/common.php中自定义Logs或者myLog处理方法:

application/common.php Log Write function

/**
 * Log Write
 * @param string $data
 * @param string $path
 */
function logs($data = '', $path = '')
{
    if (empty($data)) return false;

    if (empty($path)) $path = 'error'; 

    $path = Env::get('runtime_path').'log/'.$path;

    if (!is_dir($path)) $mkdir_re = mkdir($path, 0777, TRUE);

    $path = $path.'/'.date('Y-m-d').'.log';

    $data = date('Y-m-d H:i:s') . "\n" . (is_array($data) ? serialize($data) : $data) . "\n\n";

    $handle = fopen($path, 'a');

    fwrite($handle, $data);

    fclose($handle);
}
原文链接:,转发请注明来源!

发表评论