ホームページ  >  記事  >  PHPフレームワーク  >  Laravelで例外を処理する方法を詳しく解説した記事

Laravelで例外を処理する方法を詳しく解説した記事

青灯夜游
青灯夜游転載
2022-10-02 06:00:272775ブラウズ

Laravelで例外を処理する方法を詳しく解説した記事

この記事では、Laravel Web フレームワークの最も重要でありながらあまり議論されていない機能の 1 つである 例外処理 について説明します。 Laravel には例外ハンドラーが組み込まれており、フレンドリーな方法で例外を簡単に報告および提示できます。

この記事の前半では、例外ハンドラーによって提供されるデフォルト設定について説明します。実際、最初に、Laravel がデフォルトの Handler クラスを通じて例外を処理する方法を理解します。

記事の後半では、カスタム例外をキャッチできるようにカスタム例外ハンドラーを作成する方法を引き続き紹介します。

基本構成

例外処理クラスの学習を始める前に、まず例外に関連するいくつかの重要なパラメーター構成を見てみましょう。

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);
}

レポート メソッドは、エラーをログ ファイルに記録するために使用されます。同時に、ログに記録すべきでないすべての例外カテゴリをリストする重要な 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 クラスを継承する必要があることに注意することが重要です。デモンストレーションの目的で、レンダリング メソッドについてのみ説明しましたが、レポート メソッドをカスタマイズすることもできることは明らかです。

ご覧のとおり、この例ではユーザーを errors.custom エラー ページにリダイレクトします。このようにして、特定の種類の例外に対してカスタム エラー ページを実装できます。

もちろん、関連するビュー ファイル resources/views/errors/custom.blade.php を作成する必要があります。

Exception details: <b>{{ $exception->getMessage() }}</b>

これは、1 行のエラー メッセージを表示するだけの非常に単純なビュー ファイルですが、ビューは任意にデザインできます。

また、カスタム例外クラスを確実に呼び出せるように、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 メソッドで例外の種類を確認します。例外のカテゴリが \App\Exceptions\CustomException の場合、このクラスの 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。