Help us understand the problem. What is going on with this article?

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

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

Sub_Tanabe
YouTubeを趣味でやってます! なりたい自分が見えたので、プログラム始めました!ってなことで、なんとなくQiita始めました! YouTubeと同じく趣味の範疇でやるのでお手柔らかに。
https://www.youtube.com/channel/UCt318H2DFJr7sltZHKWoqRw
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away