Thinkphp5.1 全局異常處理


1. 封裝統一返回類

<?php
/**
 * @author SHIH
 * @date 2020/10/14 10:06
 */

namespace app\utils;

use JsonSerializable;

/**
 * 返回結果封裝
 * Class Result
 * @package app\utils
 */
class Result implements JsonSerializable {

    private $code;
    private $msg;
    private $data;

    /**
     * Result constructor.
     * @param int    $code
     * @param string $msg
     * @param string $data
     */
    public function __construct($code = 0, $msg = "success", $data = "") {
        $this->code = $code;
        $this->msg = $msg;
        $this->data = $data;
    }

    /**
     * 成功返回結果
     * @param string $data 返回數據
     * @return Result
     * @author SHIH
     * @date 2020/10/14 10:36
     */
    public static function ok($data = "") {
        return new self(0, "success", $data);
    }

    /**
     * 失敗返回結果
     * @param array  $businessStatus BusinessStatus枚舉值
     * @param string $data 返回數據
     * @return Result
     * @author SHIH
     * @date 2020/10/14 10:34
     */
    public static function fail($businessStatus, $data = "") {
        return new self($businessStatus[0], $businessStatus[1], $data);
    }

    public function __toString() {
        return json_encode($this);
    }

    /**
     * @return int
     */
    public function getCode() {
        return $this->code;
    }

    /**
     * @param int $code
     */
    public function setCode($code) {
        $this->code = $code;
    }

    /**
     * @return string
     */
    public function getMsg() {
        return $this->msg;
    }

    /**
     * @param string $msg
     */
    public function setMsg($msg) {
        $this->msg = $msg;
    }

    /**
     * @return string
     */
    public function getData() {
        return $this->data;
    }

    /**
     * @param string $data
     */
    public function setData($data) {
        $this->data = $data;
    }

    /**
     * 重寫jsonSerialize
     * @return array|mixed
     * @author SHIH
     * @date 2020/11/21 9:58
     */
    public function jsonSerialize() {
        return [
            "code" => $this->getCode(),
            "msg"  => $this->getMsg(),
            "data" => $this->getData(),
        ];
    }
}

2. 封裝業務異常狀態

<?php
/**
 * 業務異常狀態
 * @author SHIH
 * @date 2020/10/14 10:14
 */

namespace app\exception;


class BusinessStatus {

    /**
     * 成功,一切正常
     */
    const SUCCESS = [0, "success"];

    /**
     * 未登錄或登錄已過期,請重新登陸
     */
    const NOT_LOGIN = [401, "未登錄或登錄已過期,請重新登陸"];

    /**
     * 服務器錯誤
     */
    const UNKNOW_ERROR = [500, "服務器未知錯誤"];
}

3. 編寫業務異常

<?php
/**
 * 業務異常
 * @author SHIH
 * @date 2020/10/14 9:14
 */

namespace app\exception;


use Exception;

class BusinessException extends Exception {

    /**
     * 異常數據信息
     * @var object|string
     */
    private $errData;

    /**
     * BusinessException constructor.
     * @param array  $businessStatus 異常狀態及提示
     * @param object $data 異常數據信息
     */
    public function __construct($businessStatus, $data) {
        $this->errData = $data ? $data : "";
        parent::__construct($businessStatus[1], $businessStatus[0]);
    }

    /**
     * 獲取異常數據
     * @return object|string
     */
    public function getErrData() {
        return $this->errData;
    }
}

4. 編寫全局異常處理

自定義異常處理類需要繼承think\exception\Handle並且實現render方法

參考文檔:https://www.kancloud.cn/manual/thinkphp5_1/354092 異常處理接管部分

<?php
/**
 * 全局異常處理
 * @author SHIH
 * @date 2020/10/14 11:10
 */

namespace app\exception;

use Exception;
use app\utils\Result;
use think\exception\Handle;
use think\facade\Config;

class BusinessExceptionHandler extends Handle {

    public function render(Exception $exception) {
        if ($exception instanceof BusinessException) {
            $data = new Result($exception->getCode(), $exception->getMessage(), $exception->getErrData());
            return json($data, 200);
        } else if ($exception instanceof Exception) {
            $debugStatus = Config::get("app_debug");
            //開啟debug狀態,則非業務異常時會將trace信息放入data
            $errorData = $debugStatus ? $exception->getTrace() : '';
            $data = Result::fail(BusinessStatus::UNKNOW_ERROR, $errorData);
            $data->setMsg($exception->getMessage());
            return json($data, 200);
        }
        return parent::render($exception);
    }
}

5. 修改配置項

<?php

return [
    //...

    // 默認輸出類型
    'default_return_type'    => 'json',

    //...

    // 異常處理handle類 留空使用 \think\exception\Handle
    'exception_handle'       => "\\app\\exception\\BusinessExceptionHandler",
];

6. 測試

<?php

namespace app\index\controller;

use app\exception\BusinessStatus;
use app\exception\BusinessException;
use app\utils\Result;

class Index {
    public function index() {
        echo "Hello,Thinkphp5.1";
    }

    public function exception() {
        //業務邏輯
        throw new BusinessException(BusinessStatus::NOT_LOGIN, ["key" => "val",]);
    }

    public function result() {
        //業務邏輯
        return Result::ok();
    }
}

訪問index/index/exception
訪問index/index/result

SHIH/thinkphp5.1-exception


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM