thinkphp5の予測不可能な内部異常APIデータ出力ソリューションを学ぶ

元のエラー例外

次のように、saveメソッドでエラーを作成します。データ変数はありませんが、echo、


    //post 需要定义$id
    public function save()
    {
    
    

        echo $data;

        $post_data = input('post.');
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

エラーをリクエストし、例外をスローします
ここに画像の説明を挿入

エラー例外が付属しています。これは、呼び出しのルートディレクトリにある\ thinkphp \ library \ think \ exceptionにあるHandle.phpクラスのrenderメソッドです。
ここに画像の説明を挿入

    public function render(Exception $e)
    {
    
    
        if ($e instanceof HttpException) {
    
    
            return $this->renderHttpException($e);
        } else {
    
    
            return $this->convertExceptionToResponse($e);
        }
    }

新しいクラスを作成し、renderメソッドを再レンダリングし、例外をスローする方法を変更する必要があります

エラー例外クラスをカプセル化する

1.ファイルApiHandleException.phpを作成します

thinkphpwu \ application \ common \ lib \ exceptionディレクトリにApiHandleException.phpファイルを作成します。
ここに画像の説明を挿入
具体的なコードは次のとおりです。

<?php

namespace app\common\lib\exception;


//引用异常类
use think\exception\Handle;

//继承异常类
class ApiHandleException extends Handle
{
    
    

    //自定义http状态码
    public static $httpCode = 500;

    //覆盖原有render方法
    public function render(\Exception $e)
    {
    
    
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

}

2.config.php構成を変更します

アプリケーションディレクトリの下のconfig.phpでexception_handleを見つけます

ここに画像の説明を挿入
変更:

    // 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle' => 'app\common\lib\exception\ApiHandleException',

ポストマンテスト

ここに画像の説明を挿入

パッケージビジネスは例外クラスをスローします

私たちがビジネスを行うとき、バックグラウンド判定の要件を満たさない例外処理に遭遇し、それをスローします。フレームワーク自体の例外クラスのみを使用すると、ビジネスニーズを満たしません。

たとえば、saveメソッドを変更します

    //post 需要定义$id
    public function save()
    {
    
    
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') {
    
     
        //抛出异常      
            exception('域名不正确');
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

ここに画像の説明を挿入
リクエストすると、httpステータスコードが500であることがわかりますが、これは不合理です。httpcodeコードを定義するには、例外クラスをカプセル化する必要があります。

ルートディレクトリのapplication \ common \ lib \ exceptionの下にApiException.phpクラスを作成します。
ここに画像の説明を挿入
具体的なコードは次のとおりです。

<?php

namespace app\common\lib\exception;

//引用异常类
use think\Exception;


//继承异常类
class ApiException extends Exception
{
    
    
    //自定义http状态码
    public $message = '';
    public $httpCode = 400;
    public $code = 0;

    /*
     * 渲染抛出异常的状态码和信息
     */
    public function __construct($message = "", $httpCode = 0, $code = 0)
    {
    
    
        $this->message = $message;
        $this->httpCode = $httpCode;
        $this->code = $code;
    }
}

コントローラのsaveメソッドでの参照

//在class的顶部引用
use app\common\lib\exception\ApiException;


    //post 需要定义$id
    public function save()
    {
    
    
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') {
    
    
            //抛出异常
            throw new ApiException('域名不正确', 444, 1);
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

ApiHandleExceptionクラスのrenderメソッドを変更します

    //覆盖原有render方法
    public function render(\Exception $e)
    {
    
    
        //如果debug模式开启,则直接返回报错信息
        if (config('app_debug') == true) {
    
    
            return parent::render($e);
        }
        //否则debug模式关闭,返回格式化的报错信息
        if ($e instanceof ApiException) {
    
    
            self::$httpCode = $e->httpCode;
        }
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

もう一度リクエストすると、httpcodeの値が変更されていることがわかります

ここに画像の説明を挿入

デバッグモードのオンとオフ

アプリケーションディレクトリのconfig.php構成ファイルで、app_debugを見つけます。

    // 应用调试模式
    'app_debug' => false, //false为关闭,true为开启

デバッグモードをオフにして、次のコンテンツを返します。

ここに画像の説明を挿入
デバッグモードをオンにすると、次の内容が返され
ます。エラーメッセージがより直感的に表示されます。実稼働環境では、デバッグモードをオフにする必要があります。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/guo_qiangqiang/article/details/112108548