composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => Tinywan ExceptionHandler Handler::class,
];
En el modo de múltiples aplicaciones, puede configurar clases de manejo de excepciones por separado para cada aplicación; consulte Multiaplicación.
Error de parámetro de solicitud
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 ( '账号或密码不能为空' );
}
}
}
La excepción anterior genera un mensaje de error en el siguiente formato:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : "账号或密码不能为空" ,
"data" : {},
}
Toda la información de excepción devuelta se devolverá en formato json. Lo anterior es
返回简略的异常信息
Todos los controladores de errores de excepción ajustan la visualización del error de acuerdo con el valor debug
en el archivo de configuración config/app.php
Cuando debug
es true
(lo que indica que está en modo de depuración), el controlador de errores mostrará la excepción y la llamada de función detallada. pila y código fuente. Se devolverá información detallada sobre la excepción para ayudar a la depuración. Cuando debug
es false
, solo se mostrará información de error para evitar la filtración de información confidencial de la aplicación y se devolverá breve información de excepción.
Devolver información detallada de la excepción
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}"
}
}
Agregar datos de respuesta extendida de excepción
throw new BadRequestHttpException ( '验证码错误' ,[
' data ' => [
' data1 ' => '自定义响应数据1 ' ,
' data2 ' => '自定义响应数据2 ' ,
]
]);
Se agregarán parámetros de respuesta extendida personalizados a los
data
Agregue data
para devolver información detallada de la excepción
{
"code" : 0 ,
"msg" : "验证码错误" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
...
"data1" : "自定义响应数据1 " ,
"data2" : "自定义响应数据2 "
}
}
Suponga que personaliza uno: 405 Method Not Allowed
(es decir: el método de solicitud especificado en la línea de solicitud no se puede utilizar para solicitar el recurso correspondiente)
Las clases de excepción personalizadas solo necesitan heredar 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 ();
}
}
}
Utilice cartero para solicitar capturas de pantalla
JwtTokenException
ValidateException
Más: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
Escenarios de uso
HTTP状态码
devuelto por el front-end no es 429
, sino 200
u otrobody
de la respuesta no es {"code":0,"msg":"Too Many Requests"}
, sino {"error_code":200,"message":"Too Many Requests"}
y otro contenido Edite el código de status
HTTP del archivo config/plugin/tinywan/exception-handler/app.php
body
personalizado Edite los campos body
del archivo config/plugin/tinywan/exception-handler/app.php
La opción predeterminada es
{
"code" : 0 ,
"msg" : " Too Many Requests " ,
"data" : null
}
Las opciones personalizadas hacen referencia a una
1. Suponga que el código de status
HTTP está establecido en 200
2. Supongamos que la matriz body
está configurada en
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
El contenido de la respuesta es
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
Otros se pueden personalizar según su propio negocio.
Cuando el proyecto requiere mucha personalización, es probable que sea necesario extender Handler. En este caso, puede heredar TinywanExceptionHandlerHandler
y modificar el método correspondiente.
Escenarios de uso
xml
, no al formato json, solo necesita anular el método buildResponse
solveExtraException
triggerNotifyEvent
ErrorHandler
de excepción personalizado
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