Как изменить сообщение об ошибке в Laravel API
25.01.2021
364

Как изменить сообщение об ошибке в Laravel API

Иногда Laravel недостающую или не полную информации об ошибках, которые могут возникнуть работая с API. 


Из коробки в папке "App/Exceptions" вашего проекта уже размещен handler позволяющий расширить класс "Illuminate\Foundation\Exceptions\Handler" который реализует контракт "Illuminate\Contracts\Debug\ExceptionHandler".


Отправив запрос с заголовком "Accept: application/json" мы бы хотели отдавать нужное сообщение для фронтенд разработчиков.


Например, когда не найден роут, по умолчанию Laravel выбрасывает исключение "NotFoundHttpException" с пустым свойством объекта "message".

{
    "message": ""
}


Или при отсутствии искомой модели мы можем получить namespace

{
    "message": "No query results for model [App\\Models\\SomeModel] someSlug"
}


Исключения и сообщения можно легко переопределить используя публичный метод "render" вернув новый "Exception" с нужным сообщением.


Классы отвечающие за описанные ошибки выше, добавим в "App/Exceptions/handler.php"


use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;


Добавим или изменим метод render, в котором при условии, что Throwable является "NotFoundHttpException", подменим на новый экземпляр класса "NotFoundHttpException" с нужным сообщением.


    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $e
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $e)
    {
        if ($e instanceof ModelNotFoundException) {
            $e = new ModelNotFoundException('Data not found', $e->getCode(), $e->getPrevious());
        } elseif ($e instanceof NotFoundHttpException) {
            $e = new NotFoundHttpException('Route not found', $e->getPrevious(), $e->getCode(), $e->getHeaders());
        }

        return parent::render($request, $e);
    }


Таким способом можно передать нужное сообщение при возникновении ошибки.


{
    "message": "Route not found"
}
{
    "message": "Data not found"
}


Источник: ZetRider
Вывод Builder SQL запроса с переданными значениями
09.11.2021
56
Вывод Builder SQL запроса с переданными значениями

Для анализа SQL запросов в Laravel из коробки присутствует метод toSql класса \Illuminate\Database\Eloquent\Builder. Но данный метод возвращает п...

Читать →
Laravel Nova: Множественные поля
28.10.2021
67
Laravel Nova: Множественные поля

Множественные поля для Laravel Nova основаны на хранении данных в json формате свойства модели.GitHubУстановка:composer require zetrider/nova-inputs-f...

Читать →
Тестирование и отладка роутов Laravel при помощи DebugBar
09.10.2021
107
Тестирование и отладка роутов Laravel при помощи DebugBar

Для тестирования роутов на наличие дубликата sql запросов, потребления памяти или времени загрузки можно использовать удобный интерфейс laravel-debugb...

Читать →