\App\Http\Middleware\Exce-6ren">
gpt4 book ai didi

php - 如何在中间件 Laravel 5 中捕获 "too many attempt"异常

转载 作者:行者123 更新时间:2023-12-05 02:18:22 27 4
gpt4 key购买 nike

我正在构建我的 API,我成功地在我围绕我的路由设置的中间件上捕获了一些错误,如下所示:

Route::group(['middleware' => \App\Http\Middleware\ExceptionHandlerMiddleware::class], function() {

Route::resource('/address', 'AddressController');

Route::resource('/country', 'CountryController');

Route::resource('/phone', 'PhoneController');

Route::resource('/user', 'UserController');
});

中间件设法捕获以下异常:

  • Illuminate\Database\Eloquent\ModelNotFoundException
  • Illuminate\Validation\ValidationException
  • 异常

太棒了。我也知道控制路线尝试次数的 throttle 机制。因此,通过 postman ,我攻击了我的路线 http://localhost:8000/api/user 直到出现 too many attemp 错误。

异常抛出在位于 :

的文件中
/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php

而且由于这个 forum topic,我还设法得到了它抛出的异常类型: Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException

所以最后我的中间件看起来像这样:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
use Exception;

class ExceptionHandlerMiddleware
{
public function handle($request, Closure $next)
{
$output = $next($request);

try {
if( ! is_null( $output->exception ) ) {
throw new $output->exception;
}

return $output;
}
catch( TooManyRequestsHttpException $e ) {
return response()->json('this string is never showed up', 429);
}
catch( ValidationException $e ) {
return response()->json('validation error' 400);
}
catch( ModelNotFoundException $e ) {
return response()->json('not found', 404);
}
catch( \Exception $e ) {
return response()->json('unknow', 500);
}
}
}

你看到 this string is never showed up 这行了吗?事实上它从来没有出现过,来自 Illuminate 的原始 throttle 异常总是走在前面。

问题

我怎样才能以一种可能(如果可能)捕获任何异常而不必修改 illuminate 文件(在更新的情况下...)的方式正确地覆盖基本错误?

运行 laravel 5.4。

编辑

我负担不起手动更新 app/Http/Exception 文件,因为我的应用程序将作为我的 futures others 项目的服务提供商提供。此外,我不喜欢冒险删除这些文件上的一些先前配置,因为 routes.php 中的其他“基本”路由可能有自己的异常捕获程序。

最佳答案

实现该目标的最佳方法是使用 app\Exceptions\Handler.php

public function render($request, Exception $exception)
{
if ($this->isHttpException($exception)) {
if (request()->expectsJson()) {
switch ($exception->getStatusCode()) {
case 404:
return response()->json(['message' => 'Invalid request or url.'], 404);
break;
case '500':
return response()->json(['message' => 'Server error. Please contact admin.'], 500);
break;

default:
return $this->renderHttpException($exception);
break;
}
}
} else if ($exception instanceof ModelNotFoundException) {
if (request()->expectsJson()) {
return response()->json(['message' =>$exception->getMessage()], 404);
}
} {
return parent::render($request, $exception);
}
return parent::render($request, $exception);
}

在此演示中,您可以添加更多异常,如 } else if ($exception instanceof ModelNotFoundException) { 并解决它们。

关于php - 如何在中间件 Laravel 5 中捕获 "too many attempt"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45419193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com