LoginSignup
4
2

More than 5 years have passed since last update.

Laravelでエラーページに対してリダイレクトを設定する

Posted at

はじめに
Laravelで開発している時に、エラーページが出た際に指定のページにリダイレクトをしたかったのですが、Laravelのバージョンが古い事もあり、解決するのに時間がかかったので書いておきます。

やりたい事
・ユーザーが存在しないページにアクセスした時に、そのままエラー画面を表示するのではなく、指定のページにリダイレクトさせる。

バージョン
PHP 7.2.7
Laravel Framework 5.4

やった事
Handller.phpにステータスコードを指定してあげて、指定ページにリダイレクトさせる。

app/Exceptions/Handler.php
public function render($request, Exception $exception) {
  if($exception->getStatusCode() == 404) {
    return redirect('URL');
  }
  return parent::render($request, $exception);
}

これで無事に(?)リダイレクトするようになりました。
まぁ、通常だったらカスタマイズした404ページを表示する方が殆どだと思いますが・・。
てっきり、ルーティングを指定するweb.phpで管理するのかと思ったけど、エラーを認識するステータスコードを取得する方法が分からずで時間がかかりました。

っとしばらくするとこんなエラーが・・。
[error] 27225#27225: *59524 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to undefined method Symfony\Component\Debug\Exception\FatalThrowableError::getStatusCode() in /var/www/inquiry/app/Exceptions/Handler.php:56

HTTP以外の例外が来た時にgetStatusCode()を使うとエラーになるらしい。
なので、それを判断する条件分岐を追加しました。

なので、最終的には以下のコードに。

app/Exceptions/Handler.php
public function render($request, Exception $exception) {
  if($this->isHttpException($exception)) {
    if($exception->getStatusCode() == 404) {
      return redirect('URL');
    }
  }
  return parent::render($request, $exception);
}

これで、404ステータスコードが出たページはリダイレクトするようになりました。

補足
ルーティング 5.6 Laravel
Laravelのバージョンが5.6以上だと、フォールバックルートというメソッドが使用できて、
他のルートに一致しないリクエストが来ると実行できるルーティングを設定出来ます。

エラーとログ 5.4 Laravel
上記ソースコードで使用したHandllerクラスは
アプリケーションで発生する例外を管理するクラスみたいです。

参考
Laravelでエラー時に表示するページのカスタマイズ
Laravel5.5で任意のエラー画面を出すときに注意した方がいいこと

4
2
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
4
2