php666
@php666
PHP-макака

Отлов исключений в Laravel. Как наиболее правильно?

Привет участники!
Взял за основу Laravel Boilerplate, пишу по образу и подобию, но возникли вопросы.

Сейчас есть такой код сохранения записи:
В репозитории:
public function create(array $data) : Document
    {
        return DB::transaction(function () use ($data) {
            $document = $this->model::create([
                'number' => $data['number'],
                // ....
            ]);

            if ($document) {
                return $document;
            }

            throw new GeneralException(__('exceptions.backend.common.create_error'));
        });
    }

В контроллере:
public function store(Request $request)
    {
        $this->documentRepository->create($request->only(
            'number',
            // ....
        ));

        return redirect()->route('admin.docflow.document.list')
            ->withFlashSuccess(__('alerts.backend.common.created'));
    }


Сейчас сэмулировал ошибку БД, выбросилось и не поймалось ни одним слоем исключение Illuminate\Database\QueryException. Я думал, фреймворк как-то из коробки умеет такие ситуации обрабатывать.

Вопросы:
1. В каком слое принято обрабатывать такие ситуации?
2. Каким кэтчем отлавливать бОльшую часть исключений? Стоит ли использовать \Exception?
3. Стоит ли делать так:

public function create(array $data) : Document
    {
        try {
            return DB::transaction(function () use ($data) {
                $document = $this->model::create([
                    'number' => $data['number'],
                   // ....
                ]);

                if ($document) {
                    return $document;
                }

                throw new GeneralException(__('exceptions.backend.common.create_error'));
            });
        } catch (\Exception $e) {
            throw new GeneralException($e->getMessage());
        }
    }
  • Вопрос задан
  • 486 просмотров
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
1. В каком слое принято обрабатывать такие ситуации?
Зависит от логики приложения, однозначного ответа нет.

2. Каким кэтчем отлавливать бОльшую часть исключений? Стоит ли использовать \Exception?
\Throwable отловит всё. Хорошая ли это идея - спорный вопрос, однозначного ответа нет.

3. Стоит ли делать так:
Если есть реальные веские причины, то стоит. Нет - нет. В вашем вопросе причин таких не наблюдается.

Я думал, фреймворк как-то из коробки умеет такие ситуации обрабатывать.
Умеет.
Ответ написан
Комментировать
Alex_Wells
@Alex_Wells
PHP/Kotlin
Их не должен никто отлавливать. Ни фреймворк, ни вы.

Это то, что должно попасть к вам в лог, оттуда оповестить вас о проблеме и вы должны ее исправить. В чем смысл подменять QueryException своим GeneralException, да еще и без указания $previous третим аргументом конструктора exception'а? Что бы утратить stack trace? Зачем это в принципе делать?

Это internal server error. Он нигде не должен отлавливатся, аж до обработчика App\Exceptions\Handler.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
АэроТур Санкт-Петербург
от 170 000 до 190 000 ₽
DIGITAL SECTOR Краснодар
от 100 000 до 150 000 ₽
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект