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

Как изменить сообщение об ошибке в 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
Laravel Nova - Как вывести в трендах сумму за период
24.02.2021
212
Laravel Nova - Как вывести в трендах сумму за период

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...

Читать →
Bash деплой - аналог Envoyer
24.02.2021
254
Bash деплой - аналог Envoyer

Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...

Читать →
reCaptcha v2 для Laravel
21.02.2021
263
reCaptcha v2 для Laravel

Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...

Читать →