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. สมมติว่ารหัสสถานะ HTTP status
ถูกตั้งค่าเป็น 200
2. สมมติว่าอาร์เรย์ body
ถูกตั้งค่าเป็น
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
เนื้อหาตอบกลับคือ
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
อื่นๆ สามารถปรับแต่งตามธุรกิจของคุณเองได้
เมื่อโปรเจ็กต์ต้องการการปรับแต่งจำนวนมาก อาจจำเป็นต้องขยาย Handler ในกรณีนี้ คุณสามารถสืบทอด 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