Laravelでメール自動返信機能のついた、お問い合わせフォームを作成してる時に発生した出来事を記事にするぞ!
・多重送信ができることが発覚した時のワイ(・o・)//WRYYYYYYYY(Dio)
・多重送信が発生する条件 = 送信ボタン連打
//DB保存処理&完了画面表示
public function complete(Request $request){
//DBに保存
$contact = new Contact;
$contact->name = $request->name;
$contact->email = $request->email;
$contact->body = $request->body;
$contact->save();
//メール自動返信の奴
$sendData = $request->all();
\Mail::to($sendData['email'])->send(new ContactSendMail($sendData));
$request->session()->regenerateToken(); ←多重送信防止一応書いてる
return view('contact.complete');
}
このコードで送信ボタンを連打するとメール自動返信の処理が重いからか、送信ボタンめちゃ押せて、その分リクエスト飛ぶ。(DBに保存&同じメールが何件も送られてくる。。。)
//多重送信防止処理
if (!Cache::add('used_token.' . $request->session()->token(), 1, 1)) {
return view('contact.complete');
}
この処理をメソッドのはじめに配置!
どの様な処理か...
同じトークンで1回以上リクエストを送れないようにする!
送られてきたらelseの処理!
なお、Cacheクラスを使用するので、
use Illuminate\Support\Facades\Cache;
//DB保存処理&完了画面表示
public function complete(Request $request){
//追加した記述始め
//多重送信防止処理
if (!Cache::add('used_token.' . $request->session()->token(), 1, 1)) {
return view('contact.complete')←使用済みだったときの処理;
//追加した記述終わり
}
$contact = new Contact;
$contact->name = $request->name;
$contact->email = $request->email;
$contact->body = $request->body;
$contact->save();
$sendData = $request->all();
\Mail::to($sendData['email'])->send(new ContactSendMail($sendData));
$request->session()->regenerateToken();
return view('contact.complete');
}
こうすると、送信ボタンを連打しても大丈夫!(プログラミング歴3ヶ月の言葉...)