Как отобразить представление ошибок 500 с настраиваемым сообщением?

Мне нужно отображать сообщения в зависимости от типа исключения в моем собственном представлении 'errors.500'. Я сделал следующее решение в классе Handler, которое до сих пор работает, но я боюсь, что это не совсем правильно, потому что оно преобразует исключение типа сервера в тип http. Может ли это вызвать опасность? Какой подход лучше?

public function render($request, Exception $exception)
{

    if ($exception instanceof FatalErrorException) {
        $exception = new HttpException(500, "Server error");
    }

    if ($exception instanceof ModelNotFoundException) {
       $exception = new HttpException(500, "Model not found");
    }

    if ($exception instanceof RelationNotFoundException) {
        $exception = new HttpException(500, "Relation not found");
    }
    return parent::render($request, $exception);
}

Во-первых, ненайденные исключения должны иметь код статуса http 404. Во-вторых, зачем вам нормальное исключение? Я полагаю, вы обслуживаете HTML через HTTP (S), поэтому исключение HTML должно быть в порядке? Если вы не хотите его преобразовывать, зачем его преобразовывать?

delboy1978uk 10.09.2018 14:56

Извините, я имел ввиду http, свою ошибку. ModelNotFoundException - исключение Eloquent на стороне сервера. Laravel не отображает исключения, которые не являются экземплярами HttpException, поэтому я преобразовал его.

aabk 10.09.2018 15:13

Смотрите мой ответ ниже. Да, с вами все будет в порядке

delboy1978uk 10.09.2018 15:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
1
3
99
2

Ответы 2

Это просто для того, чтобы вы могли установить правильный код состояния?

public function render($request, Exception $exception)
{
    if ($exception instanceof FatalErrorException) {
        $code = 500;
    }

    if ($exception instanceof ModelNotFoundException) {
       $code = 404;
    }

    if ($exception instanceof RelationNotFoundException) {
        $code = 404;
    }
    $exception = new HttpException($exception->getMessage(), $code, $exception->getFile(), $exception->getLine());
    return parent::render($request, $exception);
}

Отображение исключения - хорошая идея в режиме разработки. Программистам особенно полезно иметь возможность видеть исключение во время выполнения, однако ваши пользователи в целом мало что поймут, когда им показывают исключение, и очень немногие пользователи, которые их понимают, могут использовать его против вас.

На мой взгляд, лучший подход - показать исключение доверенным разработчикам, а страницу с ошибкой общего назначения / представление / всплывающее окно / экран для пользователей в целом, поэтому преобразовать проблему в исключение только для вашей команды и преобразовать проблему в понятный текст. в случае пользователей.

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