composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => Tinywan ExceptionHandler Handler::class,
];
En mode multi-application, vous pouvez configurer les classes de gestion des exceptions séparément pour chaque application, voir Multi-application
Erreur de paramètre de demande
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 ( '账号或密码不能为空' );
}
}
}
L'exception ci-dessus génère un message d'erreur au format suivant :
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : "账号或密码不能为空" ,
"data" : {},
}
Toutes les informations d'exception renvoyées seront renvoyées au format json. Ce qui précède est
返回简略的异常信息
Tous les gestionnaires d'erreurs d'exception ajustent l'affichage des erreurs en fonction de la valeur debug
dans le fichier de configuration config/app.php
Lorsque debug
est true
(indiquant qu'il est en mode débogage), le gestionnaire d'erreurs affichera l'exception et l'appel de fonction détaillé. pile et code source pour faciliter le débogage, des informations détaillées sur les exceptions seront renvoyées. Lorsque debug
est false
, seules les informations d'erreur seront affichées pour empêcher la fuite d'informations sensibles de l'application, et de brèves informations d'exception seront renvoyées.
Renvoyer des informations détaillées sur les exceptions
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}"
}
}
Ajouter des données de réponse étendue d'exception
throw new BadRequestHttpException ( '验证码错误' ,[
' data ' => [
' data1 ' => '自定义响应数据1 ' ,
' data2 ' => '自定义响应数据2 ' ,
]
]);
Des paramètres de réponse étendus personnalisés seront ajoutés aux
data
Ajouter data
pour renvoyer des informations détaillées sur les exceptions
{
"code" : 0 ,
"msg" : "验证码错误" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
...
"data1" : "自定义响应数据1 " ,
"data2" : "自定义响应数据2 "
}
}
Supposons que vous en personnalisiez une : 405 Method Not Allowed
(ce qui signifie : la méthode de requête spécifiée dans la ligne de requête ne peut pas être utilisée pour demander la ressource correspondante)
Les classes d'exceptions personnalisées doivent uniquement hériter 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 ();
}
}
}
Utilisez le facteur pour demander des captures d'écran
JwtTokenException
ValidateException
Plus : https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
Scénarios d'utilisation
HTTP状态码
renvoyé par le front-end n'est pas 429
, mais 200
ou autrebody
de la réponse n'est pas {"code":0,"msg":"Too Many Requests"}
, mais {"error_code":200,"message":"Too Many Requests"}
et d'autres contenus Modifiez le code d' status
HTTP du fichier config/plugin/tinywan/exception-handler/app.php
body
personnalisé Modifiez les champs body
du fichier config/plugin/tinywan/exception-handler/app.php
L'option par défaut est
{
"code" : 0 ,
"msg" : " Too Many Requests " ,
"data" : null
}
Options personnalisées référence 1
1. Supposons que le code d' status
HTTP soit défini sur 200
2. Supposons que le tableau body
soit défini sur
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
Le contenu de la réponse est
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
D'autres peuvent être personnalisés en fonction de votre propre entreprise
Lorsque le projet nécessite beaucoup de personnalisation, il sera probablement nécessaire d'étendre Handler. Dans ce cas, vous pouvez hériter de TinywanExceptionHandlerHandler
et modifier la méthode correspondante.
Scénarios d'utilisation
xml
, pas au format JSON, il suffit de remplacer la méthode buildResponse
solveExtraException
triggerNotifyEvent
ErrorHandler
d'exception personnalisée
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