실수
ㅋㅋ | 메소드
- HTTP 예외
- Custom HTTP 오류 페이지
- 소개
- 새 Laravel 프로젝트를 시작하면 오류 및 예외 처리가 이미 구성되어 있습니다. 클래스는 애플리케이션에 의해 발생된 모든 예외를 기록하고 사용자에게 제시하는 역할을 담당합니다. 이 문서에서는 이 클래스를 자세히 살펴보겠습니다.
Configuration
config/app.php
구성 파일의 debug
옵션은 오류에 대해 사용자에게 실제로 표시되는 정보의 양을 결정합니다. 기본적으로 이 옵션의 설정은 .env
파일에 저장된 APP_DEBUG
환경 변수의 값을 따릅니다. config/app.php
配置文件中的 debug
选项决定了对于一个错误实际上将显示多少信息给用户。默认情况下,该选项的设置将遵照存储在 .env
文件中的 APP_DEBUG
环境变量的值。
对于本地开发,你应该将 APP_DEBUG
环境变量的值设置为 true
。在生产环境中,该值应始终为 false
。如果在生产中将该值设置为 true
,则可能会将敏感配置值暴露给应用程序的终端用户。
异常处理器
Report 方法
所有异常都是由 AppExceptionsHandler
类处理的。这个类包含两个方法: report
和 render
。我们将详细剖析这些方法。 report
方法用于记录异常或将它们发送给如 Bugsnag 或 Sentry 等外部服务。默认情况下, report
方法将异常传递给记录异常的基类。不过,你可以任何自己喜欢的方式来记录异常。
例如,如果你需要以不同方式报告不同类型的异常,则可以使用 PHP 的 instanceof
比较运算符:
/** * 报告或记录异常 * * 此处是发送异常给 Sentry、Bugsnag 等外部服务的好位置。 * * @param \Exception $exception * @return void */ public function report(Exception $exception){ if ($exception instanceof CustomException) { // } parent::report($exception); }
{tip} 不要在
report
方法中进行太多的instanceof
检查,而应考虑使用 可报告异常(Reportable exception) 。
全局日志
在正常情况下, Laravel 会自动将当前用户的 ID 作为数据添加到每一条异常日志中。 你可以在通过重写 AppExceptionsHandler
类中的 context
方法来定义你的全局环境变量。 之后,这个变量将包含在每一条异常日志中:
/** * 定义默认的环境变量 * * @return array */ protected function context(){ return array_merge(parent::context(), [ 'foo' => 'bar', ]); }
report
辅助函数
有时你可能需要报告异常,但又不希望终止当前请求的处理。 report
辅助函数允许你使用异常处理器的 report
方法在不显示错误页面的情况下快速报告异常:
public function isValid($value){ try { // 验证值... } catch (Exception $e) { report($e); return false; } }
按类型忽略异常
异常处理器的 $dontReport
APP_DEBUG
환경 변수의 값을 true
로 설정해야 합니다. 프로덕션 환경에서는 이 값이 항상 false
여야 합니다. 프로덕션에서 이 값을 true
로 설정하면 민감한 구성 값이 애플리케이션의 최종 사용자에게 노출될 수 있습니다. 보고 방법
🎜모든 예외는AppExceptionsHandler
클래스에 의해 처리됩니다. 이 클래스에는 report
및 render
라는 두 가지 메서드가 포함되어 있습니다. 우리는 이러한 방법을 자세히 분석할 것입니다. report
메소드는 예외를 기록하거나 Bugsnag 또는 Sentry와 같은 외부 서비스로 보내는 데 사용됩니다. 기본적으로 report
메서드는 예외를 기록하는 기본 클래스에 예외를 전달합니다. 그러나 원하는 방식으로 예외를 기록할 수 있습니다. 🎜🎜예를 들어, 다양한 유형의 예외를 다르게 보고해야 하는 경우 PHP의 instanceof
비교 연산자를 사용할 수 있습니다: 🎜/** * 不应被报告的异常类型清单。 * * @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,];
🎜{tip} report를 사용하지 마세요. code> 메서드에 instanceof
검사가 너무 많습니다. 대신 보고 가능 예외를 사용해 보세요. 🎜
글로벌 로그
🎜일반적인 상황에서 Laravel은 자동으로 현재 사용자의 ID를 데이터로 각 항목에 추가합니다. 예외 로그.AppExceptionsHandler
클래스의 context
메서드를 재정의하여 전역 환경 변수를 정의할 수 있습니다. 이후에는 이 변수가 모든 예외 로그에 포함됩니다: 🎜/** * 将异常转换为 HTTP 响应。 * * @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
도우미 함수
🎜때때로 당신은 예외를 보고해야 하지만 현재 요청 처리를 종료하고 싶지 않을 수 있습니다. report
도우미 기능을 사용하면 예외 처리기의 report
메서드를 사용하여 오류 페이지를 표시하지 않고 예외를 빠르게 보고할 수 있습니다. 🎜<?php namespace App\Exceptions;use Exception; class RenderException extends Exception{ /** * 报告异常 * * @return void */ public function report() { // } /** * 转换异常为 HTTP 响应 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response(...); } }
유형별 예외 무시
🎜예외 처리기의$dontReport
속성에는 기록되지 않는 예외 유형 집합이 포함되어 있습니다. 예를 들어, 404 오류 및 기타 여러 유형의 오류로 인해 발생한 예외는 로그 파일에 기록되지 않습니다. 필요에 따라 이 배열에 다른 예외 유형을 추가할 수 있습니다. 🎜abort(404);🎜🎜🎜🎜🎜🎜
Render 메서드
render
메서드는 주어진 예외를 브라우저로 다시 보낼 HTTP 응답으로 변환하는 역할을 합니다. 기본적으로 예외는 응답을 생성하는 기본 클래스에 전달됩니다. 그러나 원하는 경우 예외 유형을 확인하거나 사용자 정의 응답을 반환할 수 있습니다. render
方法负责将给定的异常转换为将被发送回浏览器的 HTTP 响应。默认情况下,异常将传递给为你生成响应的基类。不过,你可以按自己意愿检查异常类型或返回自己的自定义响应:
abort(403, 'Unauthorized action.');
Reportable & Renderable 异常
除了在异常处理器的 report
和 render
方法中检查异常类型,你还可以直接在自定义异常上定义 report
和 render
方法。当定义了这些方法时,它们会被框架自动调用:
<h2>{{ $exception->getMessage() }}</h2>
{tip} 你可以声明
report
方法和必要参数,它们将通过 Laravel 的 服务容器 自动注入方法中
HTTP 异常
一些异常用于描述产生自服务器的 HTTP 错误代码。例如,「页面未找到」错误 (404), 「未经授权的错误」(401) ,甚至可以是开发人员引起的 500 错误。 你可以使用 abort
辅助函数从应用程序的任何地方生成这样的响应:
php artisan vendor:publish --tag=laravel-errors
辅助函数 abort
会立即引发一个由异常处理器渲染的异常。你还可选择性地提供响应文本:
自定义 HTTP 错误页面
Laravel 可以轻松显示各种 HTTP 状态代码的自定义错误页面。例如,如果你希望自定义 404 HTTP 状态码的错误页面,可以创建一个 resources/views/errors/404.blade.php
视图文件。该文件将被用于你的应用程序产生的所有 404 错误。此目录中的视图文件的命名应匹配它们对应的 HTTP 状态码。由 abort
函数引发的 HttpException
实例将作为 $exception
变量传递给视图:
你可以使用 vendor:publish
rrreee
report
및 render
메서드에서 예외 유형을 확인하는 것 외에도 사용자 정의 예외 /code> 및 render
메소드. 이러한 메서드가 정의되면 프레임워크에서 자동으로 호출됩니다. 🎜rrreee🎜{tip} report
메서드와 필요한 매개변수를 선언할 수 있으며 자동으로 메서드에 주입됩니다. Laravel의 서비스 컨테이너를 통해 🎜
🎜 🎜예외 처리기의 🎜🎜HTTP 예외
🎜몇 가지 예외 서버에서 발생한 HTTP 오류 코드를 설명하는 데 사용됩니다. 예를 들어 "페이지를 찾을 수 없음" 오류(404), "무단 오류"(401) 또는 개발자에 의해 발생한 500 오류도 있습니다.abort
도우미 함수를 사용하면 애플리케이션 어디에서나 다음과 같은 응답을 생성할 수 있습니다. 🎜rrreee🎜도우미 함수 abort
는 예외 처리기에 의해 렌더링된 예외를 즉시 발생시킵니다. 선택적으로 응답 텍스트를 제공할 수도 있습니다: 🎜rrreee🎜🎜🎜resources/views/errors/404.blade.php
보기 파일을 생성할 수 있습니다. 이 파일은 애플리케이션에서 생성된 모든 404 오류에 사용됩니다. 이 디렉터리의 보기 파일 이름은 해당 HTTP 상태 코드와 일치하도록 지정되어야 합니다. abort
함수에 의해 발생한 HttpException
인스턴스는 $Exception
변수로 뷰에 전달됩니다. 🎜rrreee🎜 를 사용할 수 있습니다. Vendor:publish< /code> 오류 템플릿 페이지를 정의하는 Artisan 명령입니다. 템플릿 페이지가 생성된 후 템플릿 페이지의 콘텐츠를 사용자 정의할 수 있습니다. 🎜rrreee🎜이 글은 🎜LearnKu.com🎜 웹사이트에 처음 게시되었습니다. 🎜🎜