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为开启
デバッグモードをオフにして、次のコンテンツを返します。
デバッグモードをオンにすると、次の内容が返され
ます。エラーメッセージがより直感的に表示されます。実稼働環境では、デバッグモードをオフにする必要があります。