Как поймать «слишком много попыток» исключение в промежуточном программном обеспечении Laravel 5

Я строю свой 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
  • Exception

Что здорово. Я также знаю о механизме газа, который контролирует количество попыток на маршруте. Так что с почтальоном я атаковал свой маршрут http://localhost:8000/api/user пока я не получу too many attemp ошибка.

Исключение выдается в файле, расположенном по адресу:

/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php

И мне также удалось получить тип исключения, которое он выбрасывает благодаря этому тема форума : 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 всегда берет фронт.

ВОПРОС

Как я могу правильно переопределить базовую ошибку таким образом, чтобы я мог (если возможно) перехватить любое исключение без изменения файла подсветки (в случае обновлений …)?

Снаряжение для бега 5.4.

РЕДАКТИРОВАТЬ

Я не могу позволить себе обновление вручную app/Http/Exception файлы, потому что мое приложение будет поставляться в качестве поставщика услуг для моего будущего проекта. Кроме того, я не предпочитаю рисковать стереть некоторые предыдущие настройки этих файлов, так как другие «основные» маршруты в routes.php могут иметь свои собственные процедуры отлова исключений.

0

Решение

Лучший способ добиться этого — использовать 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) { и решать их.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]