composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => Tinywan ExceptionHandler Handler::class,
];
Im Multianwendungsmodus können Sie Ausnahmebehandlungsklassen für jede Anwendung separat konfigurieren, siehe Multianwendung
Anforderungsparameterfehler
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 ( '账号或密码不能为空' );
}
}
}
Die obige Ausnahme löst eine Fehlermeldung im folgenden Format aus:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code" : 0 ,
"msg" : "账号或密码不能为空" ,
"data" : {},
}
Alle zurückgegebenen Ausnahmeinformationen werden im JSON-Format zurückgegeben. Das Obige sind
返回简略的异常信息
Alle Ausnahme-Fehlerbehandler passen die Fehleranzeige entsprechend dem debug
Wert in der Konfigurationsdatei config/app.php
Wenn debug
-Wert true
ist (was anzeigt, dass er sich im Debug-Modus befindet), zeigt der Fehlerbehandler die Ausnahme und den detaillierten Funktionsaufruf an Stapel- und Quellcode zur Unterstützung des Debuggens, detaillierte Ausnahmeinformationen werden zurückgegeben. Wenn debug
Wert false
ist, werden nur Fehlerinformationen angezeigt, um den Verlust vertraulicher Informationen der Anwendung zu verhindern, und es werden kurze Ausnahmeinformationen zurückgegeben.
Gibt detaillierte Ausnahmeinformationen zurück
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}"
}
}
Fügen Sie erweiterte Antwortdaten für Ausnahmen hinzu
throw new BadRequestHttpException ( '验证码错误' ,[
' data ' => [
' data1 ' => '自定义响应数据1 ' ,
' data2 ' => '自定义响应数据2 ' ,
]
]);
Den
data
Fügen Sie data
hinzu, um detaillierte Ausnahmeinformationen zurückzugeben
{
"code" : 0 ,
"msg" : "验证码错误" ,
"data" : {
"request_url" : " POST //127.0.0.1:8888/oauth/issue-token " ,
...
"data1" : "自定义响应数据1 " ,
"data2" : "自定义响应数据2 "
}
}
Angenommen, Sie passen eine an: 405 Method Not Allowed
(Bedeutung: Die in der Anforderungszeile angegebene Anforderungsmethode kann nicht zum Anfordern der entsprechenden Ressource verwendet werden.)
Benutzerdefinierte Ausnahmeklassen müssen nur TinywanExceptionHandlerExceptionBaseException
erben
<?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 ();
}
}
}
Nutzen Sie den Postboten, um Screenshots anzufordern
JwtTokenException
des Validator-Plug-InsValidateException
des JWT-Autoritätsauthentifizierungs-Plug-ins Mehr: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
Nutzungsszenarien
HTTP状态码
ist nicht 429
, sondern 200
oder ein andererbody
besteht nicht aus {"code":0,"msg":"Too Many Requests"}
, sondern aus {"error_code":200,"message":"Too Many Requests"}
und anderen Inhalten Bearbeiten Sie den status
-HTTP-Statuscode der Datei config/plugin/tinywan/exception-handler/app.php
body
Textrückgabeinhalt Bearbeiten Sie die body
der Datei config/plugin/tinywan/exception-handler/app.php
Die Standardoption ist
{
"code" : 0 ,
"msg" : " Too Many Requests " ,
"data" : null
}
Benutzerdefinierte Optionen verweisen auf eine davon
1. Gehen Sie davon aus, dass der status
-HTTP-Statuscode auf 200
gesetzt ist
2. Gehen Sie davon aus, dass das body
Array auf eingestellt ist
' body ' => [
' error_code ' => 200 ,
' message ' => '请求太多请稍后重试'
]
Der Antwortinhalt ist
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
"error_code" : 200 ,
"message" : "请求太多请稍后重试"
}
Andere können an Ihr eigenes Unternehmen angepasst werden
Wenn das Projekt viele Anpassungen erfordert, muss Handler wahrscheinlich erweitert werden. In diesem Fall können Sie TinywanExceptionHandlerHandler
erben und die entsprechende Methode ändern.
Nutzungsszenarien
xml
und nicht auf das JSON-Format reagieren. Sie müssen lediglich die buildResponse
-Methode überschreibensolveExtraException
triggerNotifyEvent
überschreiben Benutzerdefinierter Ausnahme 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