LoginSignup
2
4

More than 3 years have passed since last update.

【Laravel】Requestによるバリデーションは効かせつつ、他は共通エラー

Last updated at Posted at 2019-12-23

Requestによるバリデーションチェックによるエラー表示は機能させつつ、
他のエラー発生時は共通エラー画面に遷移させる方法です。

環境

  • PHP:バージョン7.3.7
  • Laravel:バージョン5.8
  • OS:Windows10

はじめにやったこと

エラーが発生したら、とりあえずエラー画面に遷移させればいいんだよね、
というわけで、デフォルトの記述をコメントアウトし、以下のように変更。
※リダイレクト先は、\routes\web.php で制御しています。

\app\Exceptions\Handler.php

    public function render($request, Exception $e)
    {
        return redirect('/');
        /* 
        以下はデフォルトの記述
        return parent::render($request, $e);
        */

    }

問題発生

ところが、問題発生。
Requestを使ったバリデーションチェックで、エラー発生時にも共通エラー画面に遷移してしまった。
この場合はエラー内容を自画面に表示させたいので、これでは困る・・・。

解決方法

結論から言うと、\app\Exceptions\Handler.phpで、以下のように記述してあげればOK。

\app\Exceptions\Handler.php

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
// 以下を追記
use Illuminate\Validation\ValidationException; 

class Handler extends ExceptionHandler
{

##
## 省略
##

    public function render($request, Exception $e)
    {
        if($e instanceof ValidationException) {
            // バリデーションエラー発生時
            return $this->convertValidationExceptionToResponse($e, $request);
        }else{
            // それ以外は共通エラー画面へ(リダイレクト先は\routes\web.phpで指定)
            return redirect('/');
        }
    }
}

use Illuminate\Validation\ValidationException;
して、バリデーションエラーの場合のみ、
return $this->convertValidationExceptionToResponse($e, $request);
で、バリデーションエラーが出るようにする。
それ以外は共通エラー画面へ。

もう少し詳しく見てみる

\app\Exceptions\Handler.phpで読み込まれていた、
\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
を見てみましょう。

\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
##
## 省略
##
use Illuminate\Validation\ValidationException;
##
## 省略
##

class Handler implements ExceptionHandlerContract
{
##
## 省略
##

    // \app\Exceptions\Handler.phpのrenderファンクションの親に当たるメソッド
    public function render($request, Exception $e)
    {
        if (method_exists($e, 'render') && $response = $e->render($request)) {
            return Router::toResponse($request, $response);
        } elseif ($e instanceof Responsable) {
            return $e->toResponse($request);
        }

        $e = $this->prepareException($e);

        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        } elseif ($e instanceof AuthenticationException) {
            return $this->unauthenticated($request, $e);
        } elseif ($e instanceof ValidationException) {   // この部分を拝借
            return $this->convertValidationExceptionToResponse($e, $request);
        }

        return $request->expectsJson()
                        ? $this->prepareJsonResponse($request, $e)
                        : $this->prepareResponse($request, $e);
    }

##
## 省略
##

上のように、バリデーションエラーに関する記述があったので、その部分を拝借しました。
※「ValidationException」で検索してみてください。

感想

うまく条件分岐させれば、他のエラー発生時にも、応用効きそう。
そのうちやってみようと思います。

参考

以下を参考にさせていただきました。
ありがとうございました!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4