이 글에서는 Laravel 웹 프레임워크의 가장 중요하면서도 가장 적게 논의된 기능 중 하나인 예외 처리
를 살펴보겠습니다. Laravel에는 친숙한 방식으로 예외를 쉽게 보고하고 표시할 수 있는 내장된 예외 처리기가 포함되어 있습니다. 异常处理
。 Laravel 带有一个内置的异常处理程序,可以让您轻松地以友好的方式报告和呈现异常。
在文章的前半部分,我们将探讨异常处理程序提供的默认设置。 事实上,我们首先会通过默认的 Handler 类来理解 Laravel 是如何处理异常的。
在文章的后半部分,我们将继续介绍如何创建自定义异常处理程序,以便您可以捕获自定义异常。
在开始研究异常处理类之前,让我们先来看看几个和异常相关且很重要的参数配置。
打开 config/app.php
文件,并仔细的看看下面的代码片段。
... ... /* |-------------------------------------------------------------------------- | 应用的调试模式 |-------------------------------------------------------------------------- | | 当引用处于调试模式,将会显示错误产生式的详细堆栈信息 | 如果禁用,则只显示一个简单的错误页面 | */ 'debug' => env('APP_DEBUG', false), ... ...
从参数的名称可以猜到,如果设置为 TRUE
,将有利于我们调试应用产生的错误。默认值由 .env
环境变量配置文件中的 APP_DEBUG
参数指定。
在开发环境下,建议你将它设置为 TRUE
,这样,通过清晰的错误堆栈信息,能很快的定位错误产生的原因并修复。 另外,当处于正式环境是,我们需要通过环境变量的配置项来关闭它,当错误产生式将只显示通用的提示页面。
除了将错误显示在页面上,Laravel 也允许你将错误记录到日志文件中。现在,让我们来看看日志相关的配置,打开 config/app.php
文件,并仔细的看看下面的代码片段。
... ... 'log' => env('APP_LOG', 'single'), 'log_level' => env('APP_LOG_LEVEL', 'debug'), ... ...
Laravel 框架中,是使用 Monolog 库来记录日志的。你可以通过上面的配置项来配置 Monolog 库。
默认的日志文件保存路径为 storage/logs/laravel.log
,通常情况下,你无需更改它。与此同时,你可以通过 APP_LOG_LEVEL
来指定需要被记录到日志文件的错误级别。
前面介绍了异常和日志的基本配置。
接下来,我们看看 Laravel 应用默认的异常处理类。打开 app/Exceptions/Handler.php
文件.
<?php namespace App\Exceptions; use Exception; use Illuminate\Auth\AuthenticationException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { /** * 定义无需报告的异常类型 * * @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\Session\TokenMismatchException::class, \Illuminate\Validation\ValidationException::class, ]; /** * 报告或者通过日志记录一个异常 * * 可以在这个方法中将异常报告给 Sentry, Bugsnag 等平台 * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * 将异常通过 Http 返回 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); } /** * 将认证相关的异常转换为未认证的响应(401) * * @param \Illuminate\Http\Request $request * @param \Illuminate\Auth\AuthenticationException $exception * @return \Illuminate\Http\Response */ protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } return redirect()->guest(route('login')); } }
上面的处理类主要包含2个功能:报告和显示所有的异常信息。
让我们仔细看一眼 report
方法。
/** * 报告或记录一个异常。 * * 这是一个将异常发送给 Sentry 和 Bugsnag 等机构的好时机。 * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); }
report 方法用于将错误记录到日志文件中。同时,关注一项重要的 dontReport
属性,它列出了所有不应该被记录到日志的异常类别。
接下来,我们介绍 render
方法。
/** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { return parent::render($request, $exception); }
如果说 report
方法是用于记录或报告错误,那么 render
方法是用于将错误渲染显示在屏幕上。事实上,当异常发生时,这个方法决定了哪些内容将被展示给用户。
render
方法也允许你针对不同类别的错误自定义响应值,这部分内容我们将在下一章学习。
最后, unauthenticated
方法处理了 AuthenticationException
异常,你能够在此决定当用户访问了一个未授权页面时所展示的内容。
在这一节,我们将创建一个自定义异常类,用于处理 CustomException
类别的异常。创建自定义异常类背后的想法是更轻松地管理自定义异常同时显示自定义响应。
开始着手创建一个文件 app/Exceptions/CustomException.php
,内容如下所示。
<?php namespace App\Exceptions; use Exception; class CustomException extends Exception { /** * 报告这个异常。 * * @return void */ public function report() { } /** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request * @return \Illuminate\Http\Response */ public function render($request) { return response()->view( 'errors.custom', array( 'exception' => $this ) ); } }
重要的是需要注意 CustomException
类必须继承核心 Exception
类。为了演示用途,我们仅仅讨论了 render 方法,但显然你也能够自定义修改 report 方法。
正如你看到的,在样例中我们将用户重定向至 errors.custom
错误页面。通过这种方式,你能够为特定类型的异常实现自定义的错误页面。
当然,我们需要创建一个关联的视图文件 resources/views/errors/custom.blade.php
。
Exception details: <b>{{ $exception->getMessage() }}</b>
这是一个相当简单的视图文件,只显示一行错误消息,不过你也可以按照自己希望的方式设计这个视图。
我们也需要在 app/Exceptions/Handler.php
文件的 render 方法中进行一些修改,保证我们的自定义异常类能够被调用。让我们将 app/Exceptions/Handler.php
文件中的 render 方法替换为以下内容。
... ... /** * 将异常渲染至 HTTP 响应值中。 * * @param \Illuminate\Http\Request $request * @param \Exception $exception * @return \Illuminate\Http\Response */ public function render($request, Exception $exception) { if ($exception instanceof \App\Exceptions\CustomException) { return $exception->render($request); } return parent::render($request, $exception); } ... ...
正如你所看到的,我们会在 render 方法中首先检查异常的类型。如果异常的类别是 AppExceptionsCustomException
,我们将调用这个类的 render 方法。
一切准备就绪。现在我们创建一个控制 app/Http/Controllers/ExceptionController.php
config/app.php
파일을 열고 다음 코드 조각을 자세히 살펴보세요. 🎜<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class ExceptionController extends Controller { public function index() { // 出错了,你可以抛出自定义的异常 CustomException throw new \App\Exceptions\CustomException('Something Went Wrong.'); } }🎜매개변수 이름에서 짐작할 수 있듯이
TRUE
로 설정하면 애플리케이션에서 생성된 오류를 디버그하는 데 도움이 됩니다. 기본값은 .env
환경 변수 구성 파일의 APP_DEBUG
매개변수로 지정됩니다. 🎜🎜개발 환경에서는 TRUE
로 설정하는 것을 권장합니다. 이렇게 하면 명확한 오류 스택 정보를 통해 오류의 원인을 빠르게 찾아 수정할 수 있습니다. 또한, 정식 환경에서는 환경변수의 설정 항목을 통해 이를 꺼야 하는데, 에러가 발생하면 일반 프롬프트 페이지만 표시됩니다. 🎜🎜페이지에 오류를 표시하는 것 외에도 Laravel을 사용하면 로그 파일에 오류를 기록할 수도 있습니다. 이제 로깅 관련 구성을 살펴보겠습니다. config/app.php
파일을 열고 다음 코드 조각을 자세히 살펴보겠습니다. 🎜// Exception routes Route::get('exception/index', 'ExceptionController@index');🎜Laravel 프레임워크에서는 로그를 기록하는 데 Monolog 라이브러리가 사용됩니다. 위의 구성 항목을 통해 Monolog 라이브러리를 구성할 수 있습니다. 🎜🎜기본 로그 파일 저장 경로는
storage/logs/laravel.log
입니다. 일반적으로 변경할 필요는 없습니다. 동시에 APP_LOG_LEVEL
을 전달하여 로그 파일에 기록해야 하는 오류 수준을 지정할 수 있습니다. 🎜🎜예외 및 로그의 기본 구성은 앞서 소개했습니다. 🎜🎜다음으로 Laravel 애플리케이션의 기본 예외 처리 클래스를 살펴보겠습니다. app/Exceptions/Handler.php
파일을 엽니다. 🎜rrreee🎜위 처리 클래스에는 주로 모든 예외 정보를 보고하고 표시하는 두 가지 기능이 포함되어 있습니다. 🎜🎜report
방식을 자세히 살펴보겠습니다. 🎜rrreee🎜보고 방법은 오류를 로그 파일에 기록하는 데 사용됩니다. 또한 기록되어서는 안 되는 모든 예외 카테고리를 나열하는 중요한 dontReport
속성에 주의하세요. 🎜🎜다음으로 render
메소드를 소개합니다. 🎜rrreee🎜report
메서드를 사용하여 오류를 기록하거나 보고하는 경우 render
메서드를 사용하여 오류를 화면에 렌더링하고 표시합니다. 실제로 이 메서드는 예외가 발생할 때 사용자에게 표시할 콘텐츠를 결정합니다. 🎜🎜render
메소드를 사용하면 다양한 유형의 오류에 대한 응답 값을 사용자 정의할 수도 있습니다. 이에 대해서는 다음 장에서 배우게 됩니다. 🎜🎜마지막으로 unauthenticated
메서드는 AuthenticationException
예외를 처리하며, 여기서 사용자가 승인되지 않은 페이지에 액세스할 때 표시할 콘텐츠를 결정할 수 있습니다. 🎜CustomException
범주의 예외를 처리하기 위한 사용자 정의 예외 클래스를 생성합니다. 사용자 정의 예외 클래스를 생성하는 기본 아이디어는 사용자 정의 응답을 표시하면서 사용자 정의 예외를 보다 쉽게 관리하는 것입니다. 🎜🎜다음 내용을 포함하는 app/Exceptions/CustomException.php
파일 생성을 시작하세요. 🎜rrreee🎜CustomException
클래스는 핵심 Exception
클래스를 상속해야 한다는 점에 유의하는 것이 중요합니다. 데모 목적으로 렌더링 방법만 논의했지만 보고서 방법을 사용자 정의할 수도 있습니다. 🎜🎜보시다시피, 이 예에서는 사용자를 errors.custom
오류 페이지로 리디렉션합니다. 이렇게 하면 특정 유형의 예외에 대한 사용자 정의 오류 페이지를 구현할 수 있습니다. 🎜🎜물론 관련 뷰 파일 resources/views/errors/custom.blade.php
를 생성해야 합니다. 🎜rrreee🎜한 줄의 오류 메시지만 표시하는 상당히 간단한 보기 파일이지만 원하는 대로 보기를 디자인할 수 있습니다. 🎜🎜또한 사용자 정의 예외 클래스를 호출할 수 있도록 app/Exceptions/Handler.php
파일의 렌더링 메서드를 일부 수정해야 합니다. app/Exceptions/Handler.php
파일의 render 메서드를 다음으로 바꾸겠습니다. 🎜rrreee🎜보시다시피 먼저 render 메소드에서 예외 유형을 확인하겠습니다. 예외 클래스가 AppExceptionsCustomException
인 경우 이 클래스의 render 메서드를 호출합니다. 🎜🎜모든 것이 준비되었습니다. 이제 사용자 정의 예외 클래스를 테스트하기 위해 app/Http/Controllers/ExceptionController.php
컨트롤을 생성합니다. 🎜<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; class ExceptionController extends Controller { public function index() { // 出错了,你可以抛出自定义的异常 CustomException throw new \App\Exceptions\CustomException('Something Went Wrong.'); } }
当然,你需要先在 routes/web.php
文件中添加相关的路由,就像下面一样。
// Exception routes Route::get('exception/index', 'ExceptionController@index');
之后,你可以浏览 http://your-laravel-site.com/exception/ind... 地址来查看是否和预期的一样。一切正常的话,页面将显示我们前面配置 errors.custom
视图。
就这样,你就可以按自己方式来处理 Laravel 中的异常。
完!尽情享受 Laravel 带来的编码的乐趣吧!
今天,我们认真学习了 Laravel 中的异常处理特性。在文章的开头,我们搜索了 Laravel 提供的一些基础配置,用于显示和报告异常。紧接着,我们简要介绍了默认的异常处理类。
在文章的后半部分,我们通过创建一个自定义异常处理类,演示如何在应用中处理自定义的异常。
对于那些刚刚起步学习 Laravel ,或者期待拓展阅读相关知识、网站、应用扩展的读者,这里有一系列您能够学习的内容,参见 Envato Market 。
期待听到任何形式的咨询或建议!
原文地址:https://code.tutsplus.com/tutorials/exception-handling-in-laravel--cms-30210
译文地址:https://learnku.com/laravel/t/8783/exception-handling-in-laravel
【相关推荐:laravel视频教程】
위 내용은 Laravel에서 예외를 처리하는 방법을 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!