>  기사  >  PHP 프레임워크  >  이 기사에서는 thinkphp5에서 전역 예외를 사용자 정의하는 방법을 설명합니다.

이 기사에서는 thinkphp5에서 전역 예외를 사용자 정의하는 방법을 설명합니다.

藏色散人
藏色散人앞으로
2021-11-02 16:07:352509검색

다음thinkphp 프레임워크튜토리얼 칼럼에서는 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와 함께 제공되는 오류 처리 클래스에서 상속됩니다. 렌더링 메서드를 재정의하여 오류를 사용자 정의할 수 있습니다.

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. 요약

laravel 프레임워크를 포함한 TP5 프레임워크뿐만 아니라 예외 클래스의 렌더링 메서드를 직접 다시 작성하여 원하는 오류 반환 데이터나 페이지 템플릿을 얻을 수도 있습니다.

위 내용은 이 기사에서는 thinkphp5에서 전역 예외를 사용자 정의하는 방법을 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제