Requestによるバリデーションチェックによるエラー表示は機能させつつ、
他のエラー発生時は共通エラー画面に遷移させる方法です。
環境
- PHP:バージョン7.3.7
- Laravel:バージョン5.8
- OS:Windows10
はじめにやったこと
エラーが発生したら、とりあえずエラー画面に遷移させればいいんだよね、
というわけで、デフォルトの記述をコメントアウトし、以下のように変更。
※リダイレクト先は、\routes\web.php で制御しています。
public function render($request, Exception $e)
{
return redirect('/');
/*
以下はデフォルトの記述
return parent::render($request, $e);
*/
}
問題発生
ところが、問題発生。
Requestを使ったバリデーションチェックで、エラー発生時にも共通エラー画面に遷移してしまった。
この場合はエラー内容を自画面に表示させたいので、これでは困る・・・。
解決方法
結論から言うと、\app\Exceptions\Handler.phpで、以下のように記述してあげればOK。
<?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
を見てみましょう。
##
## 省略
##
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」で検索してみてください。
感想
うまく条件分岐させれば、他のエラー発生時にも、応用効きそう。
そのうちやってみようと思います。
参考
以下を参考にさせていただきました。
ありがとうございました!