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