動作環境
- Laravel 8.40.0
- PHP 8.0.3
- macOS 12.0.1
- CentOS Linux release 7.8.2003 (Core)でも検証済み
登録フォームなどで意図しないリクエストにより複数回フォームが送信され重複したデータが保存される場合があります。
その対策方法をまとめます。
重複したリクエストが発生するケースとして以下のケースが考えられるかと思います。
二重送信となるケース
- フォームのサブミットボタンをダブルクリックする
- フォーム送信後、戻るボタンでフォームに戻り再度サブミットボタンをクリックする
- フォーム送信後の完了ページでリロードする
対策方法
コントローラーのstoreメソッドなどのpostデータがデータベースに保存される際に以下のコードを記載する。
$request->session()->regenerateToken();
例
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Answer;
class AnswersController extends Controller
{
public function store(Request $request)
{
$answer = new Answer();
$answer->answer = $request->answer;
$answer->save();
// 二重送信防止
$request->session()->regenerateToken();
return view('answers/success');
}
}
この対策を行うと、二重送信がされた際には419エラーが返され、データの重複登録などが発生しないようになります。