こんにちは!
個人開発者の南です。
今回は、LaravelのExceptionのカスタマイズ方法について紹介します。
Laravelの処理を書いている時に下記のように、エラーメッセージを任意の場所にリダイレクトさせて使いたいということがあると思います。
1 2 |
throw new RedirectExceptions(route('リダイレクトさせたい場所'), $e->getMessage()); exit; |
今回の記事では、LaravelのデフォルトのExceptionをカスタマイズして、上記のように実装する方法を紹介します。
Exceptionをカスタマイズする手順
LaravelのExceptionをカスタマイズするには、下記の手順を踏んでいきます。
・app/Exceptions直下に専用のExceptionを作成。
・app/Exceptions/Handler.phpに処理を作成。
app/Exceptions直下に専用のExceptionを作成について
まずは、Laravelのapp/Exceptions直下にエラーメッセージを任意の場所にリダイレクトさせて使うための専用のExceptionを作成していきます。
下記のように処理を書いた、ファイルを作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\Exceptions; use Exception; class RedirectExceptions extends Exception { public $redirectTo; public $message; public function __construct(string $redirectTo, string $message) { # リダイレクトさせたい場所を指定。 $this->redirectTo = $redirectTo; # リダイレクト先で表示するメッセージを指定。 $this->message = $message; } } |
名前は、リダイレクトさせて使うため「RedirectExceptions.php」としました。
app/Exceptions/Handler.phpに処理を作成について
ファイルが作成できたら、今度は「app/Exceptions/Handler.php」を開きます。
デフォルトの場合だと、ファイルを開いた時下記のように記載されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?php namespace App\Exceptions; use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; class Handler extends ExceptionHandler { /** * A list of the exception types that are not reported. * * @var array */ protected $dontReport = [ // ]; /** * A list of the inputs that are never flashed for validation exceptions. * * @var array */ protected $dontFlash = [ 'password', 'password_confirmation', ]; /** * Report or log an exception. * * @param \Exception $exception * @return void */ public function report(Exception $exception) { parent::report($exception); } /** * 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) { return parent::render($request, $exception); } } <!-- code --> 上記コードのうち「render」の箇所を下記のように書き換えます。 <!-- code --> public function render($request, Exception $exception) { # 使用されているExceptionがRedirectExceptionsの場合は、リダイレクトさせる。 if ($exception instanceof \App\Exceptions\RedirectExceptions) { return \Illuminate\Support\Facades\Redirect::To($exception->redirectTo)->withErrors([ 'exception' => $exception->message])->withInput(Input::all()); } return parent::render($request, $exception); } |
これで、任意の場所にリダイレクトさせることができるようになります。
実際の使用方法
実際使用する場合は、任意の箇所でExceptionを投げます。
1 2 3 4 5 6 7 |
function checkUserEmailFormat($email) { # メールアドレスのフォーマットが正しいかチェックして、正しくなければ例外を投げる。 if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ throw new \Exception('メールの形式が正しくありません。'); } } |
投げられたExceptionをキャッチして、「user.register」ルートにリダイレクトさせます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# RedirectExceptionsをインポート。 use App\Exceptions\RedirectExceptions; class PayPalPlanServices { public function checkUserEmail() { try { checkUserEmailFormat($email); } catch (\Exception $e) { report($e); # 例外のメッセージを取得し、user.registerルートにリダイレクトさせる。 throw new RedirectExceptions(route('user.register'), $e->getMessage()); exit; } } } |
リダイレクト先のBladeファイルに下記の記述を加えます。
1 2 3 4 5 6 |
# 例外が投げられた場合は、例外エラーを表示。 @if ($errors->has('exception')) <div class="notification is-danger"> <strong>{{ $errors->first('exception') }}</strong> </div> @endif |
これで任意の場所にリダイレクトさせて、Exceptionエラーを表示することができます。
まとめ
今回は、LaravelのExceptionのカスタマイズ方法について紹介しました。
LaravelのExceptionをカスタマイズして、任意の場所にリダイレクトさせてExeptionを表示させたいといった場合は、下記のステップを踏むようにしましょう。
・app/Exceptions直下に専用のExceptionを作成。
・app/Exceptions/Handler.phpに処理を作成。