@romicohen
Системный Архитектор

Почему так странно работает findOrFail()?

Внезапно я вспомнил про findOrFail() - и она действительно бросает исключение, если не находит модель :) ОДНАКО смотрите что в выводе:

{
    "message": "No query results for model [App\\Models\\User] 9999999",
    "exception": "Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException",


и все бы тут ничего, но дело в том, что "message" оно берет из

Illuminate\Database\Eloquent\ModelNotFoundException


тогда как "exception" у нее, как видите, другой...

И самая главная проблема, что если я хочу изменить вывод в Handler через renderable(), то мне приходится указывать в качестве аргумента NotFoundHttpException у которого нет нужного мне метода getModel() (для отображения в message)

Это что, какой-то косяк разработчиков, или что?

Навскидку в голову ничего не пришло, как это можно поправить "мягким" способом, может чего посоветуете?

upd.: там вообще магия какая-то :) бо в самой функции вызывается именно

throw (new ModelNotFoundException)->setModel(
            get_class($this->model), $id
        );


откуда там взялось NotFoundHttpException - тот еще вопрос :D
  • Вопрос задан
  • 263 просмотра
Решения вопроса 2
@jazzus
$this->renderable(function (NotFoundHttpException $e, $request) {
    if ($request->is('users/*')) {
        return response()->json([
            'message' => 'Юзер не найден'
        ], 404);
    }
});
Ответ написан
@romicohen Автор вопроса
Системный Архитектор
В общем, благодаря дискуссии в каментах с коллегой jazzus я пришел к выводу, что приемлемого решения этого вопроса на данный момент не существует.

Можно конечно отлавливать исключение ModelNotFoundException в месте вызова при помощи try-catch:

try {
            $user = User::findOrFail($id);
        } catch (ModelNotFoundException $e) {
            return response()->json(['model' => $e->getModel()], 404);
        }


но это такое себе...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
1. к вопросу "откуда там взялось NotFoundHttpException..."
src/Illuminate/Foundation/Exceptions/Handler.php
2. не хочешь стандартных исключенией - не юзай findOrFail
2.1 не можешь без findOrFail - измени поведение app/Exceptions/Handler.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы