Как я могу поймать NotFoundHttpException в laravel, чтобы отправить пользовательский ответ? - PullRequest
0 голосов
/ 19 мая 2019

Я не могу понять, почему laravel не перехватывает исключение NotFoundHttpException, но он перехватывает все другие исключения.

Я хочу отправить пользовательский ответ json своим пользователям в зависимости от типа исключения, это работает для всех перечисленных исключений, кроме NotFoundHttpException:

namespace App\Exceptions;

use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Auth\AuthenticationException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{

    public function render($request, Exception $exception)
    {
        switch (true) {
            case $exception instanceof QueryException:
                return response()->json('QueryException')

            case $exception instanceof NotFoundHttpException:
                return response()->json('NotFoundHttpException')

            case $exception instanceof AuthenticationException:
                return response()->json('AuthenticationException')

            default:
                return response()->json('Different Exception')
        }

        //return parent::render($request, $exception);
    }
}

Когда я делаю запрос на создание исключения NotFoundHttpException, laravel отвечает параметром регистра по умолчанию, какие-либо рекомендации по этому поводу?

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Обработчик исключений Laravel решает, как обрабатывать выброс исключений, а исключение ModelNotFoundException по умолчанию игнорируется.

Проверьте файл в app / Exceptions / Handler.php, который расширит обработчик исключений в платформе Laravel.

Посмотрите документацию здесь: https://laravel.com/docs/5.8/errors#the-exception-handler

0 голосов
/ 19 мая 2019

Я нашел решение этой проблемы, я до сих пор не совсем понимаю, как это работает, но у меня это сработало, позвольте мне объяснить:

Когда я имел APP_DEBUG = true в файле .env и использовал функцию рендеринга по умолчанию в классе Handler, он выдавал мне 'Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException'.

Но когда я сделал get_class ($ исключение), чтобы убедиться, что он выбрасывает тот же класс, по какой-то причине он выбрасывал «Illuminate \ Database \ Eloquent \ ModelNotFoundException». Поэтому я просто изменил свой код, чтобы поймать это исключение: Пространство имен App \ Exceptions;

use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{

    public function render($request, Exception $exception)
    {
        switch (true) {
            case $exception instanceof QueryException:
                return response()->json('QueryException')

            case $exception instanceof ModelNotFoundException:
                return response()->json('ModelNotFoundException')

            case $exception instanceof AuthenticationException:
                return response()->json('AuthenticationException')

            default:
                return response()->json('Different Exception')
        }

        //return parent::render($request, $exception); //This throws a ModelNotFoundException
    }
}

Это решило проблему, но я до сих пор не понимаю, почему он вызывает другое исключение по умолчанию.

Это код, который выдает исключение, когда я отправляю запрос get на localhost: 8000 / api / users / $ id, на несуществующий идентификатор пользователя.

//UserController.php

public function show(User $user)
{
    return new UserResource($user);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...