ThinkPHP5之自定义全局异常

为了针对书写 api 时,对各种错误返回不通的 json ,直接使用 TP5 自带的提示错误页面,对于客户端而言,明显没有任何的作用,所以需要自己来自定义全局异常。

1.创建一个全局异常的类(用于传错误信息,状态码等)
use think\Exception;
class BaseException extends Exception {
    /** HTTP 状态码
     * @var string
     */
    public $code;
    
    /** 自定义错误码
     * @var string
     */
    public $errorCode;
    
    /** 错误信息
     * @var string
     */
    public $msg;
    
    public function __construct($params=[])
    {
        if (! $params) {
            return ;
        }
        
        // 如果传了 code
        if ($array_key_exists('code', $code) {
            $this->code = $code;
        }
        
        // 如果传了 errorCode
        if (array_key_exists('errorCode', $params)) {
            $this->errorCode = $params['errorCode'];
        }

        // 如果传了 msg
        if (array_key_exists('msg', $params)) {
            $this->msg = $params['msg'];
        }
    }
}
复制代码

这样就可以给以传不通的状态码,错误信息和自定义错误码。

2. 创建一个错误处理类

错误处理类,继承于TP5自带的错误处理类,重写该 render 方法,就可以自定义错误。

use Exception;
use think\exception\Handle;
use think\Request;

class ExceptionHandle extends Handle 
{
    /** 状态码
     * @var
     */
    private $code;

    /** 自定义错误码
     * @var
     */
    private $errorCode;

    /** 错误信息
     * @var
     */
    private $msg;
    
    /** 重写 Handle 方法里的Render
     * @param Exception $e
     * @return \think\response\Json
     */
            // 注意这里是基类 Exception
    public function render(Exception $e) 
    {
        if ($e instanceof BaseException) {
            //如果是自定义异常,则控制http状态码,不需要记录日志
            //因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            //不应当记录日志

            $this->msg = $e->msg;
            $this->code = $e->code;
            $this->errorCode = $e->errorCode;
        } else {
            // 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
            if (config('app_debug')) {
                // 调试状态下需要显示TP默认的异常页面,因为TP的默认页面
                // 很容易看出问题
                return parent::render($e);
            }
            $this->code = 500;
            $this->msg = '服务器内部错误,不想告诉你';
            $this->errorCode = 999;
            $this->recordErrorLog($e);
        }

        $request = Request::instance();

        $result = [
            'msg' => $this->msg,
            'errorCode' => $this->errorCode,
            'request_url' => $request->url()
        ];
        return json($result, $this->code);
    }
    
    /** 错误日志处理
     *  这里把config里日志配置的type改为test
     * @param Exception $e
     */
    private function recordErrorLog(Exception $e)
    {
        // 开启日志
        Log::init([
            'type'  =>  'File',
            'path'  =>  LOG_PATH,
            'level' => ['error']
        ]);
        
        // 日志记录方法
        Log::record($e->getMessage(),'error');
    }
    
}
复制代码
3.修改配置config
// 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle'       => 'app\lib\exception\ExceptionHandle',
    
// 关闭日志    
'log'                    => [
        // 日志记录方式,内置 file socket 支持扩展
        // 关闭自动记录日志,请将type设置为test
        'type'  => 'test',
        // 日志保存目录
        'path'  => __DIR__.'/../log/',
        // 日志记录级别
        'level' => ['sql'],
    ],
复制代码
4.使用错误类的方法
// 这里随便创建一个userControlelr
class UserController extends Controller {

    use app\api\model\User;
    
    /**
    * 根据 id 获取某个用户
    */
    public function getUser($id)
    {
        $user = User::get($id);
        
        // 如果 $user 为空 抛出自定义的错误,下面有...
        if(! $user) {
            throw UserMissException();
        }
        
        return json($user);
    }
}
复制代码

自定义的错误子类

// 上面第一节,写的 Base 错误类派上用场了。 
class UserMissException extends BaseException
{
    /** HTTP 状态码
     * @var string
     */
    public $code = '404';

    /** 自定义错误码
     * @var string
     */
    public $errorCode = '40000';

    /** 错误信息
     * @var string
     */
    public $msg = '请求的用户不存在';
}
复制代码

请求这个 getUser 方法,报错~ 就会显示

{
    "msg": "请求的用户不存在",
    "errorCode": "40000",
    "request_url": "/api/v1/user/10"
}
复制代码

其他的错误类型,也就可以继续创建异常子类,定义这些错误属性。

5.总结

不光是在TP5的框架,包括laravel框架,也是可以自己重新写异常类Exception的render方法,来达到自己想要的错误返回数据或者是页面模版。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP5是一款基于PHP的开源框架,它提供了许多方便的功能来简化开发过程。其中,paginate是ThinkPHP5框架自带的一个用于分页的方法。 paginate方法用于在查询结果中进行分页,以便在网页上展示数据。使用paginate方法,可以非常方便地实现数据的分页显示,并且框架会自动处理分页链接的生成和点击。 在使用paginate方法时,我们可以根据自己的需求进行自定义,以便满足特定的分页需求。具体的自定义方法如下: 首先,我们需要在模型文件中添加paginate方法的自定义配置。在模型文件中找到paginate方法,可以看到其实际上调用了系统的paginate方法。我们可以在模型文件中添加自定义配置,如: ```php public function paginate($listRows = 15, $simple = false, $config = []) { // 自定义分页配置 $config['query'] = request()->param(); $config['type'] = 'app\common\paginator\Bootstrap'; return parent::paginate($listRows, $simple, $config); } ``` 在上述代码中,我们可以看到对paginate方法进行了扩展,添加了$query和$type配置项。其中,$query用于保留当前页面的查询条件,而$type用于指定分页类的命名空间。我们可以根据自己的需求进行相应的配置。 接下来,在视图文件中生成分页链接时,我们可以通过自定义模板来实现样式的自定义ThinkPHP5框架提供了内置的Bootstrap模板,在生成分页链接时可以指定使用该模板。具体的代码如下: ```php $paginate->render('app\common\paginator\Bootstrap'); ``` 在上述代码中,我们可以看到通过render方法指定了使用的分页模板。我们可以根据自己的需求指定其他模板,并进行样式的自定义。 综上所述,通过自定义paginate方法的配置和分页模板的选择,我们可以对ThinkPHP5框架中的paginate进行自定义,以便满足特定的分页需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值