
Как изменить сообщение об ошибке в 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"
}

В Laravel Nova удобно отображать метрики через тренды. Создавая периоды можно получить информацию например о новых пользователях в системе. В одном пр...
Читать →
Для быстрого деплоя личных или простых проектов можно использовать сервисы подобные Envoyer.io о котором писал ранее или написать свой велосипед на ba...
Читать →
Для защиты форм от спама полезно добавлять всем надоевшую reCaptcha от Google, которая существенно позволяет сократить количество сообщений от ботов н...
Читать →