Почему мой обработчик исключений Laravel 11 не работает?

В Laravel 11 обработка исключений перенесена в файл bootstrap/app.php. Я пытаюсь поймать AuthorizationException и вернуть пользователя на панель управления с сообщением 403:

// bootstrap/app.php

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Request;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;

return Application::configure(basePath: dirname(__DIR__))
    ...
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->render(function (AuthorizationException $e, Request $request) {
            return redirect()
                ->route('dashboard')
                ->withErrors($e->getMessage());
        });
        ...
    })
    ...
    ->create();

Но это не работает. Этот вошедший в систему пользователь не может видеть конечную точку /users, но мой обработчик исключений не обрабатывает ее. Они должны видеть свою панель управления. (Мой .env показывает APP_DEBUG=true.)

(Используйте barryvdh/laravel-debugbar на этом скриншоте)

вместо того, чтобы придумывать хакерские решения, было бы лучше спросить об этом сопровождающих, поскольку это, скорее всего, связано с Laravel 11.

kris gjika 02.07.2024 18:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
837
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновление (спасибо @Olivier):

Форум Laracasts на это чудесно ответил: https://laracasts.com/discuss/channels/laravel/how-to-catch-a-policy-response-Exception


Мой оригинал:

Изменена подсказка типа исключения, чтобы просто Throwable проверить все, что было обнаружено:

$exceptions->render(function (Throwable $e, Request $request) {
    dd($e);
    ...
});

... и похоже, что он пропустил исключение AuthorizationException и передал Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException

Теперь вопрос: «Почему?» Почему в документации Laravel не содержится более подробной информации о том, как обрабатывать распространенные исключения? В любом случае, это решено, но у других может возникнуть такая же проблема, поэтому вот мое решение:

<?php

use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;

return Application
    ::configure(basePath: dirname(__DIR__))
    ...
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->render(function (Throwable $e) {
            if ( $e instanceof AccessDeniedHttpException ) {
                /* This may be overly specific, but I want to handle other
                   potential AccessDeniedHttpExceptions when I come
                   across them */
                if ( $e->getPrevious() instanceof AuthorizationException ) {
                    return redirect()
                        ->route('dashboard')
                        ->withErrors($e->getMessage());
                }
            }
        });
    })
    ->create();

Исключение не пропускается, оно оборачивается. Подробности смотрите здесь.

Olivier 02.07.2024 19:07

Другие вопросы по теме