Вступление
Когда вы запускаете новый проект Laravel, обработка ошибок и исключений уже настроена для вас. Класс , где все исключения , вызванные приложением регистрируются , а затем оказывается обратно пользователю. Мы углубимся в этот класс на протяжении всей этой документации.App\Exceptions\Handler
Конфигурация
debug
Опция в вашем файле конфигурации определяет , сколько информации об ошибке фактически отображается пользователю. По умолчанию эта опция настроена на значение переменной среды, которая хранится в вашем файле.config/app.php
APP_DEBUG
.env
Для локальной разработки вы должны установить APP_DEBUG
переменную окружения в true
. В вашей производственной среде это значение всегда должно быть false
. Если это значение установлено true
в рабочей среде, вы рискуете раскрыть конфиденциальные значения конфигурации конечным пользователям вашего приложения.
Обработчик исключений
Метод отчета
Все исключения обрабатываются классом. Этот класс содержит два метода: и . Мы рассмотрим каждый из этих методов подробно. Этот метод используется для регистрации исключений или отправки их во внешние службы, такие как Bugsnag или Sentry . По умолчанию метод передает исключение в базовый класс, в котором регистрируется исключение. Тем не менее, вы можете регистрировать исключения, как пожелаете.App\Exceptions\Handler
report
render
report
report
Например, если вам нужно сообщать о различных типах исключений по-разному, вы можете использовать instanceof
оператор сравнения PHP :
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $exception
* @return void
*/
public function report(Exception $exception)
{
if ($exception instanceof CustomException) {
//
}
parent::report($exception);
}
Вместо того, чтобы делать много
instanceof
проверок в вашемreport
методе, рассмотрите возможность использования отчетных исключений
Контекст глобального журнала
Если доступно, Laravel автоматически добавляет идентификатор текущего пользователя в каждое сообщение журнала исключения как контекстные данные. Вы можете определить свои собственные глобальные контекстные данные, переопределив context
метод класса вашего приложения . Эта информация будет включена в сообщение журнала каждого исключения, написанное вашим приложением:App\Exceptions\Handler
/**
* Get the default context variables for logging.
*
* @return array
*/
protected function context()
{
return array_merge(parent::context(), [
'foo' => 'bar',
]);
}
report
Helper
Иногда вам может потребоваться сообщить об исключении, но продолжить обработку текущего запроса. report
Вспомогательная функция позволяет быстро сообщить исключение , используя ваш обработчик исключений в report
метод без рендеринга страницы ошибок:
public function isValid($value)
{
try {
// Validate the value...
} catch (Exception $e) {
report($e);
return false;
}
}
Игнорирование исключений по типу
$dontReport
Свойство обработчика исключений содержит массив типов исключений , которые не будут регистрироваться. Например, исключения, возникающие из-за ошибок 404, а также нескольких других типов ошибок, не записываются в ваши файлы журнала. При необходимости вы можете добавить другие типы исключений в этот массив:
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
\Illuminate\Auth\AuthenticationException::class,
\Illuminate\Auth\Access\AuthorizationException::class,
\Symfony\Component\HttpKernel\Exception\HttpException::class,
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
\Illuminate\Validation\ValidationException::class,
];
Метод рендеринга
render
Метод отвечает за превращение данного исключения в ответ HTTP , которые должны быть отправлены обратно в браузер. По умолчанию исключение передается в базовый класс, который генерирует для вас ответ. Однако вы можете проверить тип исключения или вернуть свой собственный ответ:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $exception
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
if ($exception instanceof CustomException) {
return response()->view('errors.custom', [], 500);
}
return parent::render($request, $exception);
}
Отчетные и визуализируемые исключения
Вместо исключений типа проверки в обработчик исключений - х report
и render
методов, вы можете определить report
и render
методы непосредственно на пользовательском исключения. Когда эти методы существуют, они будут автоматически вызываться платформой:
<?php
namespace App\Exceptions;
use Exception;
class RenderException extends Exception
{
/**
* Report the exception.
*
* @return void
*/
public function report()
{
//
}
/**
* Render the exception into an HTTP response.
*
* @param \Illuminate\Http\Request
* @return \Illuminate\Http\Response
*/
public function render($request)
{
return response(...);
}
}
Вы можете напечатать любые необходимые зависимости
report
метода, и они будут автоматически добавлены в метод сервисным контейнером Laravel .
Исключения HTTP
Некоторые исключения описывают коды ошибок HTTP с сервера. Например, это может быть ошибка «страница не найдена» (404), «неавторизованная ошибка» (401) или даже ошибка 500, созданная разработчиком. Чтобы сгенерировать такой ответ из любого места в вашем приложении, вы можете использовать abort
помощника:
abort(404);
abort
Помощник немедленно возбудит исключение , которое будет вынесено обработчиком исключений. При желании вы можете предоставить текст ответа:
abort(403, 'Unauthorized action.');
Пользовательские страницы ошибок HTTP
Laravel позволяет легко отображать пользовательские страницы ошибок для различных кодов состояния HTTP. Например, если вы хотите настроить страницу ошибки для 404 кодов состояния HTTP, создайте . Этот файл будет обработан для всех 404 ошибок, сгенерированных вашим приложением. Представления в этом каталоге должны быть названы так, чтобы соответствовать коду статуса HTTP, которому они соответствуют. Экземпляр поднятых функций будет передан в представление в качестве переменного:resources/views/errors/404.blade.php
HttpException
abort
$exception
<h2>{{ $exception->getMessage() }}</h2>
Вы можете опубликовать шаблоны страниц ошибок Laravel с помощью команды Artisan. После того, как шаблоны были опубликованы, вы можете настроить их по своему вкусу:vendor:publish
php artisan vendor:publish --tag=laravel-errors
0 комментариев