composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => Tinywan ExceptionHandler Handler::class,
];
في وضع التطبيقات المتعددة، يمكنك تكوين فئات معالجة الاستثناءات بشكل منفصل لكل تطبيق، راجع التطبيقات المتعددة
خطأ في معلمة الطلب
use support Request ;
use support Response ;
use Tinywan ExceptionHandler Exception BadRequestHttpException ;
class Token{
public function issueToken ( Request $ request ): Response
{
$ params = $ request -> post ();
if ( empty ( $ params )) {
throw new BadRequestHttpException ( '账号或密码不能为空' );
}
}
}
الاستثناء أعلاه يطرح رسالة خطأ بالتنسيق التالي:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : "账号或密码不能为空" ,
"data" : {},
}
سيتم إرجاع جميع معلومات الاستثناء التي تم إرجاعها بتنسيق json. ما ورد أعلاه هو
返回简略的异常信息
تقوم كافة معالجات أخطاء الاستثناء بضبط عرض الأخطاء وفقًا لقيمة debug
في ملف التكوين config/app.php
عندما تكون قيمة debug
true
(تشير إلى أنها في وضع تصحيح الأخطاء)، سيعرض معالج الأخطاء الاستثناء واستدعاء الوظيفة التفصيلي. المكدس ورقم السطر للمساعدة في تصحيح الأخطاء، سيتم إرجاع معلومات الاستثناء التفصيلية. عندما تكون قيمة debug
false
، سيتم عرض معلومات الخطأ فقط لمنع تسرب المعلومات الحساسة الخاصة بالتطبيق، وسيتم إرجاع معلومات الاستثناء المختصرة.
إرجاع معلومات الاستثناء التفصيلية
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : " password不允许为空" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
"timestamp" : " 2022-03-06 15:19:12 " ,
"client_ip" : " 172.18.0.1 " ,
"request_param" : {
"username" : " webman "
},
"error_message" : " password不允许为空" ,
"error_trace": "#0 /var/www/webman-admin/app/functions.php(68): Tinywan\Validate\Validate->check(Array)n#1 /var/www/webman-admin/app/controller/Authentication.php(25): validate(Array, 'app\\common\\vali...')n#2 /var/www/webman-admin/vendor/workerman/webman-framework/src/App.php(234): app\controller\Authentication->issueToken(Object(support\Request))n#3 /var/www/webman-admin/app/middleware/AccessControlMiddleware.php(26): Webman\App::Webman\{closure}(Object(support\Request))n#4 /var/www/webman-admin/vendor/workerman/webman-framework/src/App.php(228): app\middleware\AccessControlMiddleware->process(Object(support\Request), Object(Closure))n#5 /var/www/webman-admin/vendor/workerman/webman-framework/src/App.php(137): Webman\App::Webman\{closure}(Object(support\Request))n#6 /var/www/webman-admin/vendor/workerman/workerman/Connection/TcpConnection.php(638): Webman\App->onMessage(Object(Workerman\Connection\TcpConnection), Object(support\Request))n#7 /var/www/webman-admin/vendor/workerman/workerman/Events/Select.php(295): Workerman\Connection\TcpConnection->baseRead(Resource id #254)n#8 /var/www/webman-admin/vendor/workerman/workerman/Worker.php(2417): Workerman\Events\Select->loop()n#9 /var/www/webman-admin/vendor/workerman/workerman/Worker.php(1541): Workerman\Worker->run()n#10 /var/www/webman-admin/vendor/workerman/workerman/Worker.php(1383): Workerman\Worker::forkOneWorkerForLinux(Object(Workerman\Worker))n#11 /var/www/webman-admin/vendor/workerman/workerman/Worker.php(1357): Workerman\Worker::forkWorkersForLinux()n#12 /var/www/webman-admin/vendor/workerman/workerman/Worker.php(549): Workerman\Worker::forkWorkers()n#13 /var/www/webman-admin/start.php(87): Workerman\Worker::runAll()n#14 {main}"
}
}
إضافة استثناء بيانات الاستجابة الموسعة
throw new BadRequestHttpException ( '验证码错误' ,[
' data ' => [
' data1 ' => '自定义响应数据1 ' ,
' data2 ' => '自定义响应数据2 ' ,
]
]);
ستتم إضافة معلمات الاستجابة الموسعة المخصصة إلى
data
أضف data
لإرجاع معلومات الاستثناء التفصيلية
{
"code" : 0 ,
"msg" : "验证码错误" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
...
"data1" : "自定义响应数据1 " ,
"data2" : "自定义响应数据2 "
}
}
لنفترض أنك قمت بتخصيص واحد: 405 Method Not Allowed
(بمعنى: لا يمكن استخدام طريقة الطلب المحددة في سطر الطلب لطلب المورد المقابل)
تحتاج فئات الاستثناءات المخصصة فقط إلى وراثة فئة TinywanExceptionHandlerExceptionBaseException
<?php
declare (strict_types= 1 );
namespace support exception ;
use Tinywan ExceptionHandler Exception BaseException ;
class MethodNotAllowedException extends BaseException
{
/**
* @var int
*/
public int $ statusCode = 405 ;
/**
* @var string
*/
public string $ errorMessage = '请求行中指定的请求方法不能被用于请求相应的资源' ;
}
use support Request ;
use support Response ;
use support exception MethodNotAllowedException ;
class Token{
public function issueToken ( Request $ request ): Response
{
$ params = $ request -> post ();
if ( empty ( $ params )) {
throw new MethodNotAllowedException ();
}
}
}
استخدم ساعي البريد لطلب لقطات الشاشة
JwtTokenException
ValidateException
المزيد: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
سيناريوهات الاستخدام
HTTP状态码
الذي تم إرجاعه بواسطة الواجهة الأمامية ليس 429
، بل 200
أو غيرهbody
الاستجابة ليس {"code":0,"msg":"Too Many Requests"}
، ولكن {"error_code":200,"message":"Too Many Requests"}
ومحتويات أخرى تحرير رمز status
HTTP لملف config/plugin/tinywan/exception-handler/app.php
body
المخصص قم بتحرير حقول body
في الملف config/plugin/tinywan/exception-handler/app.php
الخيار الافتراضي هو
{
"code" : 0 ,
"msg" : " Too Many Requests " ,
"data" : null
}
تشير الخيارات المخصصة إلى واحد
1. افترض أنه تم ضبط رمز status
HTTP على 200
2. افترض أنه تم ضبط مصفوفة body
على
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
محتوى الرد هو
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
يمكن تخصيص الآخرين وفقًا لعملك الخاص
عندما يتطلب المشروع الكثير من التخصيص، فمن المحتمل أن يحتاج إلى توسيع المعالج. في هذه الحالة، يمكنك وراثة TinywanExceptionHandlerHandler
وتعديل الطريقة المقابلة.
سيناريوهات الاستخدام
xml
، وليس تنسيق json، وتحتاج فقط إلى تجاوز طريقة buildResponse
solveExtraException
triggerNotifyEvent
استثناء مخصص ErrorHandler
namespace support ;
use Illuminate Validation ValidationException ;
use Tinywan ExceptionHandler Handler ;
use Webman Http Response ;
class ErrorHandler extends Handler
{
/**
* @inheritDoc
*/
protected function solveExtraException ( Throwable $ e ): void
{
// 当前项目下的异常扩展
if ( $ e instanceof ValidationException) {
$ this -> errorMessage = $ e -> validator -> errors ()-> first ();
$ this -> errorCode = 422 ;
return ;
}
parent :: solveExtraException ( $ e );
}
/**
* @inheritDoc
*/
protected function triggerNotifyEvent ( Throwable $ e ): void
{
// ... 这里省略触发其他错误推送渠道
parent :: triggerNotifyEvent ( $ e );
}
/**
* @inheritDoc
*/
protected function buildResponse (): Response
{
// 构造自己项目下的响应
return json ([
' code ' => $ this -> statusCode , // 使用 statusCode 作为 code 返回
' msg ' => $ this -> errorMessage ,
' data ' => $ this -> responseData ,
]);
}
}
vendor/bin/phpstan analyse src
vendor/bin/php-cs-fixer fix src