質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

6419閲覧

例外発生時にページを表示させたいのですが表示しません

red13

総合スコア79

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2016/02/22 04:24

編集2016/02/22 05:28

コントローラ内で以下の様に実装しています。

try {
// ここでTokenMismatchException発生
} catch(Exception $e) {
// ここでログ出力
return redirect("abc");
}

TokenMismatchExceptionが発生すると例外がcatchされcatchの中に入ると思っていましたが
実際はログが出力されず、
画面も「Whoops, looks like something went wrong.~」と例外内容が表示されます。
このような実装ではcatchされないのでしょうか。

~~~~~追加~~~~~
エラー内容は
TokenMismatchException in VerifyCsrfToken.php line 53:

~・・・
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/02/22 04:32

まずは、app/config/app.phpの中の 'debug' => false, の行を、'debug' => true, に変更して、発生しているエラーの詳細が表示されるようにする。その後で、もう一度同じ動作をさせてみれば、原因が特定しやすくなると思います。
guest

回答1

0

ベストアンサー

本当にTokenMismatchExceptionはtryからcatchの間で呼ばれていますか?
TokenMismatchExceptionはCSRFのトークンが一致しなかった時に起きるExceptionでMiddlewareの時点でthrowするのでコントローラー等からはキャッチできないと思います。

投稿2016/02/22 10:01

fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

red13

2016/02/23 00:14

tryの中はSession::regenerateToken();を記載しています。 確認からボタン遷移で完了に。バックスペースから戻って再度ボタン遷移した場合に発生しています。 Session::regenerateToken();を削除すると発生しません。 また、質問内容にはTokenMismatchExceptionと記載しましたが、 tryの中に「aaa;」のように存在しない例外等を無理やり発生させてもcatchの中の ログ出力と画面遷移が実施されません。
fagai

2016/02/23 02:02 編集

まず、CSRF用のTokenはある程度の間は使いまわされるので、regenerateしない場合はエラーが発生しません。 regenerate(完了)してバックスペースで戻った時、ページの方では以前のTokenの値がページキャッシュとして残っており、それと判定を行っているのでTokenMismatchExceptionが発生しています。 これはMiddlewareがすでにやっているので、検知出来ません。 そして、tryの中にaaaのように書いた場合はそもそもControllerでコンストラクタインジェクションや、メソッドインジェクションを確認するためにReflectionClassを挟む必要があるので、このReflectionの時に構文エラーとなりReflectionExceptionが発生します。 tryの中でthrow new Exception(); などとすると問題なくキャッチできますので、Controllerのメソッドまで辿り着いていません。
fagai

2016/02/23 01:50

そして、このException等は500エラーを出しているのでエラー用の共通ページは簡単に用意出来ます。 resources/views/errorsの中に初期状態では503.blade.phpしか無いと思いますが、こちらに500.blade.phpも用意すると専用のエラーページが用意出来ます。 もし、TokenMismatchExceptionが発生した際に必ず特定のページに移動させたいとか、backさせたい等であればverifyしているMiddlewareを上書きするか、app/Exceptions/Handler.phpのrenderメソッド内で個別にキャッチする処理を記述すると良いでしょう。 https://laracasts.com/discuss/channels/laravel/l5-properly-handle-tokenmismatchexception-when-logging-in?page=1
red13

2016/02/23 08:37

発生させた例外はmiddleware等でcatchされているため コントローラ内でcatchできないというわけですか。 各例外の処理はmiddlewareに記載するか Handler.php内部で「if ($e instanceof ~例外) {」等の処理内容を指定するかでないと 想定どおりの結果にならないのですね。
fagai

2016/02/23 09:23 編集

そうですね。 HTTPに関わる処理のtry_catchは\Illuminate\Fondation\Http\Kernelのhandleメソッドでtry_catchがされてるようです。 この処理は一応\App\Http\Kernelで上書き出来るようですが、全てのリクエストに関わることなので触るのは良くないでしょう。。。
red13

2016/02/24 03:55

承知しました。 Handler周りを見直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問