LoginSignup
0
3

More than 3 years have passed since last update.

Laravel メール自動返信機能 フォーム多重送信防止!

Posted at

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ヶ月の言葉...)

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3