質問: 環境 -- Laravel5.8 作成中の機能 ------ 「お問い合わせフォーム」 名前や年齢をFormでControllerに送信、メールを送る。 実現したいこと ------- ・二重送信 ・Form送信完了後、戻ってリロード →上記行った場合に自分の作ったviewを表示させるようにしたい 試したこと ----- 「Csrf tokenを検証」 ``` public function form(Request $request) { if($request->session()->token() !== $request->input('_token')) { return view('Errors/hoge'); //自分で作成したviewを表示したい } $this->sendMail(); //private functionでメール送る $request->session()->regenerateToken();//tokenの作成 return view('complete'); //完了画面に行く } ``` これだと2重で送信ボタンclickなどすると、自分の作ったエラーviewが表示されず画像の様なLaravelにデフォルトである419のエラーページが表示されてしまいます。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/cc01b49a7f6850e3f9d8c036caaf5ee8.png) よろしくお願いいたします。 追記 -- ``` //form submitするview //このページは確認画面なので、inputなどはありません @csrf 名前 {{$hoge->name}} メールアドレス {{$hoget->email}} 送信 ``` 追記(aro10さんの回答に対しての追記) --------------------- > > 1,フォーム表示時に、 セッションにフォーム用のキーでランダムデータを格納し、フォームのhidden入力欄に代入しておく > > > form内にLaravelの@csrfを挿入してあります。 > > 2,フォーム送信時に送信内容と格納したセッションデータを検証、不一致の場合は専用のエラーページへ > > > ``` if($request->session()->token() !== $request->input('_token')) { ``` の部分でこれをしていると思いますが、Laravel defaultの419のページが出る。という状態です 追記(進捗状況) -------- App\Exceptions\Handler.phpを修正し、自分でExceptionのカスタマイズをした(「Handlerを書き換える」というのを今まではlaravel\framework\src\Illuminate\Foundation\Exceptions\Handler.phpの方だと勘違いしていた) ``` //App\Exceptions\Handler.php public function render($request, Exception $exception) { if ($exception instanceof TokenMismatchException) { abort(401); } } ``` **問題点 1abortの代わりにreturn response()->view('errors.401');を使用するとview画面が表示されるが、abort(401)だと画面は真っ白 (できるだけabortを使用したい) 2 ・送信完了後、戻ってreloadする場合には対応できる ・ダブルクリックされた場合は、メールが送られた後にエラー画面が表示されてしまう (JSでなくPHPの対応方法はあるか?) 追記(ほぼ解決) -------- 上記render関数一番下に下記コードを挿入(というか元々あったやつ)すると401のviewが表示された ``` return parent::render($request, $exception); ``` ・二重送信は「メールが送られた後にエラー画面が表示されてしまう」のままですが、こちらはJSで対処したいと思います
回答: https://readouble.com/laravel/5.8/ja/errors.html これを参考によしなに修正する事 LaravelデフォルトのCSRFエラーの場合は**TokenMismatchException**が投げられている