Невозможно бросать объекты, которые не реализуют Throwable

Я использую Laravel 5.5. Есть следующий класс

поставщик\ларавель\фреймворк\src\Illuminate\Routing\Middleware\ThrottleRequests.php

с именем метода: buildException

В Laravel 5.4 я смог вернуть JSON в этом методе, как показано ниже.

protected function buildException($key, $maxAttempts)
{
    $retryAfter = $this->getTimeUntilNextRetry($key);
    $headers = $this->getHeaders(
        $maxAttempts,
        $this->calculateRemainingAttempts($key, $maxAttempts, $retryAfter),
        $retryAfter
    );
    return response()->json('429 Too many requests');
}

Когда я пытаюсь вернуть JSON в вышеуказанном методе, используя Laravel 5.5, он говорит

Невозможно бросать объекты, которые не реализуют Throwable

Теперь понятно, как я могу вернуть JSON в Laravel 5.5 для вышеуказанного метода?


person Pankaj    schedule 27.09.2017    source источник


Ответы (1)


Ну, вы не можете делать это так сейчас больше. Вам нужно вернуть класс исключения. Но что вы можете сделать, так это вернуть некоторый пользовательский класс исключений, а затем в методе app/Exceptions/Handler.php in `render вы можете добавить:

if ($e instanceof YourCustomException) {
   return response()->json('429 Too many requests');
}

Конечно, если вам действительно нужно, вы можете добавить свою собственную реализацию метода handle, и вместо того, чтобы генерировать исключение, вы можете вернуть ответ прямо туда, но, вероятно, лучшим выбором будет генерирование пользовательского исключения и его обработка в классе Handler.

person Marcin Nabiałek    schedule 27.09.2017
comment
Не могли бы вы дать более подробную информацию с примером о YourCustomException в обоих местах (ThrottleRequests и Handler.php) - person Pankaj; 28.09.2017
comment
Вы можете создать собственный класс, который расширяет Symfony\Component\HttpKernel\Exception\HttpException, в методе buildException генерировать это исключение, а затем в обработчике использовать if ($e instanceof YourCustomException) { - person Marcin Nabiałek; 28.09.2017