環境
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のエラーページが表示されてしまいます。
よろしくお願いいたします。
追記
//form submitするview //このページは確認画面なので、inputなどはありません <form method="POST" action="/submit"> @csrf <table> <tr> <th>名前</th> <td>{{$hoge->name}}</td> </tr> <tr> <th>メールアドレス</th> <td>{{$hoget->email}}</td> </tr> </table> <button name="submit">送信</button> </form>
追記(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);
}
}
**問題点 ①abortの代わりにreturn response()->view('errors.401');を使用するとview画面が表示されるが、abort(401)だと画面は真っ白 (できるだけabortを使用したい) ② ・送信完了後、戻ってreloadする場合には対応できる ・ダブルクリックされた場合は、メールが送られた後にエラー画面が表示されてしまう (JSでなくPHPの対応方法はあるか?) 追記(ほぼ解決) --- 上記render関数一番下に下記コードを挿入(というか元々あったやつ)すると401のviewが表示された
return parent::render($request, $exception);
・二重送信は「メールが送られた後にエラー画面が表示されてしまう」のままですが、こちらはJSで対処したいと思います
回答2件
あなたの回答
tips
プレビュー