composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => Tinywan ExceptionHandler Handler::class,
];
Dalam mode multi-aplikasi, Anda dapat mengonfigurasi kelas penanganan pengecualian secara terpisah untuk setiap aplikasi, lihat Multi-aplikasi
Kesalahan parameter permintaan
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 ( '账号或密码不能为空' );
}
}
}
Pengecualian di atas memunculkan pesan kesalahan dalam format berikut:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : "账号或密码不能为空" ,
"data" : {},
}
Semua informasi pengecualian yang dikembalikan akan dikembalikan dalam format json. Di atas adalah
返回简略的异常信息
Semua penangan kesalahan pengecualian menyesuaikan tampilan kesalahan sesuai dengan nilai debug
di file konfigurasi config/app.php
Ketika nilai debug
true
(menunjukkan bahwa itu dalam mode debug), penangan kesalahan akan menampilkan pengecualian dan pemanggilan fungsi detail tumpukan dan kode sumber. Nomor baris untuk membantu debugging, informasi pengecualian rinci akan dikembalikan. Ketika nilai debug
adalah false
, hanya informasi kesalahan yang akan ditampilkan untuk mencegah kebocoran informasi sensitif aplikasi, dan informasi pengecualian singkat akan dikembalikan.
Kembalikan informasi pengecualian terperinci
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}"
}
}
Tambahkan pengecualian data respons yang diperluas
throw new BadRequestHttpException ( '验证码错误' ,[
' data ' => [
' data1 ' => '自定义响应数据1 ' ,
' data2 ' => '自定义响应数据2 ' ,
]
]);
Parameter respons khusus yang diperluas akan ditambahkan ke
data
Tambahkan data
untuk mengembalikan informasi pengecualian terperinci
{
"code" : 0 ,
"msg" : "验证码错误" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
...
"data1" : "自定义响应数据1 " ,
"data2" : "自定义响应数据2 "
}
}
Misalkan Anda menyesuaikan satu: 405 Method Not Allowed
(artinya: metode permintaan yang ditentukan dalam baris permintaan tidak dapat digunakan untuk meminta sumber daya yang sesuai)
Kelas pengecualian khusus hanya perlu mewarisi kelas 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 ();
}
}
}
Gunakan tukang pos untuk meminta tangkapan layar
JwtTokenException
ValidateException
Lebih lanjut: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
Skenario penggunaan
HTTP状态码
yang dikembalikan oleh front-end bukan 429
, tetapi 200
atau lainnyabody
responsnya bukan {"code":0,"msg":"Too Many Requests"}
, tetapi {"error_code":200,"message":"Too Many Requests"}
dan konten lainnya Edit status
kode status HTTP dari file config/plugin/tinywan/exception-handler/app.php
body
khusus Edit kolom body
file config/plugin/tinywan/exception-handler/app.php
Opsi defaultnya adalah
{
"code" : 0 ,
"msg" : " Too Many Requests " ,
"data" : null
}
Opsi khusus merujuk pada satu
1. Asumsikan bahwa kode status HTTP status
diatur ke 200
2. Asumsikan bahwa array body
diatur ke
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
Isi tanggapannya adalah
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
Lainnya dapat disesuaikan sesuai dengan bisnis Anda sendiri
Ketika proyek memerlukan banyak penyesuaian, kemungkinan besar perlu memperluas Handler. Dalam hal ini, Anda dapat mewarisi TinywanExceptionHandlerHandler
dan memodifikasi metode yang sesuai.
Skenario penggunaan
xml
, bukan format json, hanya perlu mengganti metode buildResponse
solveExtraException
triggerNotifyEvent
Pengecualian khusus 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