In diesem Artikel werden wir eine der wichtigsten und am wenigsten diskutierten Funktionen des Laravel-Webframeworks untersuchen – Ausnahmebehandlung
. Laravel verfügt über einen integrierten Ausnahmehandler, mit dem Sie Ausnahmen einfach melden und auf benutzerfreundliche Weise präsentieren können. 异常处理
。 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
und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜<?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
gesetzt ist. Der Standardwert wird durch den Parameter APP_DEBUG
in der Konfigurationsdatei der Umgebungsvariablen .env
angegeben. 🎜🎜In der Entwicklungsumgebung wird empfohlen, den Wert auf TRUE
zu setzen. Auf diese Weise können Sie durch klare Fehlerstapelinformationen die Fehlerursache schnell lokalisieren und beheben. Darüber hinaus müssen wir es in der formalen Umgebung über das Konfigurationselement der Umgebungsvariablen deaktivieren. Wenn ein Fehler auftritt, wird nur eine allgemeine Eingabeaufforderungsseite angezeigt. 🎜🎜Neben der Anzeige von Fehlern auf der Seite ermöglicht Ihnen Laravel auch, Fehler in einer Protokolldatei zu protokollieren. Schauen wir uns nun die protokollierungsbezogene Konfiguration an. Öffnen Sie die Datei config/app
und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜// Exception routes Route::get('exception/index', 'ExceptionController@index');
storage/logs/laravel.log
. Normalerweise müssen Sie ihn nicht ändern. Gleichzeitig können Sie APP_LOG_LEVEL
übergeben, um die Fehlerstufe anzugeben, die in der Protokolldatei aufgezeichnet werden muss. 🎜🎜Die Grundkonfiguration von Ausnahmen und Protokollen wurde bereits früher eingeführt. 🎜🎜Als nächstes werfen wir einen Blick auf die Standard-Ausnahmebehandlungsklasse der Laravel-Anwendung. Öffnen Sie die Datei app/Exceptions/Handler.php
🎜rrreee🎜Die obige Verarbeitungsklasse enthält hauptsächlich zwei Funktionen: Melden und Anzeigen aller Ausnahmeinformationen. 🎜🎜Schauen wir uns die Methode report
genauer an. Die 🎜rrreee🎜report-Methode wird verwendet, um Fehler in einer Protokolldatei zu protokollieren. Achten Sie außerdem auf ein wichtiges dontReport
-Attribut, das alle Ausnahmekategorien auflistet, die nicht protokolliert werden sollen. 🎜🎜Als nächstes stellen wir die Methode render
vor. 🎜rrreee🎜Wenn die Methode report
zum Aufzeichnen oder Melden von Fehlern verwendet wird, wird die Methode render
zum Rendern und Anzeigen von Fehlern auf dem Bildschirm verwendet. Tatsächlich bestimmt diese Methode, welcher Inhalt dem Benutzer angezeigt wird, wenn eine Ausnahme auftritt. Mit der Methode 🎜🎜render
können Sie auch Antwortwerte für verschiedene Fehlertypen anpassen, was wir im nächsten Kapitel erfahren werden. 🎜🎜Schließlich behandelt die Methode unauthenticated
die Ausnahme AuthenticationException
, bei der Sie entscheiden können, welche Inhalte angezeigt werden sollen, wenn der Benutzer auf eine nicht autorisierte Seite zugreift. 🎜CustomException
zu behandeln. Die Idee hinter der Erstellung einer benutzerdefinierten Ausnahmeklasse besteht darin, benutzerdefinierte Ausnahmen einfacher zu verwalten und gleichzeitig benutzerdefinierte Antworten anzuzeigen. 🎜🎜Beginnen Sie mit der Erstellung einer Datei app/Exceptions/CustomException.php
mit dem folgenden Inhalt. 🎜rrreee🎜Es ist wichtig zu beachten, dass die Klasse CustomException
die Kernklasse Exception
erben muss. Zu Demonstrationszwecken haben wir nur die Rendermethode besprochen, aber natürlich können Sie auch die Berichtsmethode anpassen. 🎜🎜Wie Sie sehen können, leiten wir den Benutzer im Beispiel auf die Fehlerseite errors.custom
um. Auf diese Weise können Sie benutzerdefinierte Fehlerseiten für bestimmte Ausnahmetypen implementieren. 🎜🎜Natürlich müssen wir eine zugehörige Ansichtsdatei resources/views/errors/custom.blade.php
erstellen. 🎜rrreee🎜Dies ist eine ziemlich einfache Ansichtsdatei, die nur eine einzeilige Fehlermeldung anzeigt, aber Sie können die Ansicht nach Ihren Wünschen gestalten. 🎜🎜Wir müssen außerdem einige Änderungen an der Render-Methode der Datei app/Exceptions/Handler.php
vornehmen, um sicherzustellen, dass unsere benutzerdefinierte Ausnahmeklasse aufgerufen werden kann. Ersetzen wir die Render-Methode in der Datei app/Exceptions/Handler.php
durch Folgendes. 🎜rrreee🎜Wie Sie sehen, prüfen wir zunächst die Art der Ausnahme in der Render-Methode. Wenn die Klasse der Ausnahme AppExceptionsCustomException
ist, rufen wir die Rendermethode dieser Klasse auf. 🎜🎜Alles ist bereit. Jetzt erstellen wir ein Steuerelement app/Http/Controllers/ExceptionController.php
, um die benutzerdefinierte Ausnahmeklasse zu testen. 🎜<?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视频教程】
Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!