この記事では、thinkphp5 でグローバル例外をカスタマイズする方法について説明します。

藏色散人
リリース: 2021-11-02 16:07:35
転載
2511 人が閲覧しました

次の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 に付属のエラー処理クラスを継承しており、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 メソッドを要求し、エラーreport~ は、

{
    "msg": "请求的用户不存在",
    "errorCode": "40000",
    "request_url": "/api/v1/user/10"
}
ログイン後にコピー

他のエラー タイプを表示します。引き続き例外サブクラスを作成し、これらのエラー属性を定義できます。

5. まとめ

Laravel フレームワークを含む TP5 フレームワークだけでなく、例外クラスの render メソッドを自分で書き換えて、目的のエラー戻りデータやページを実現することもできます。ステンシル。

以上がこの記事では、thinkphp5 でグローバル例外をカスタマイズする方法について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.im
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート