前提・実現したいこと
フロント:Nuxt、バックエンド:Laravelでシステムを構築しています。
システム内のメッセージ機能で、メッセージが送信された際に受信ユーザーの登録メールアドレスにメール通知がいくようにしたいと考えています。
- システム内でメッセージを入力し、送信ボタンを押す
- NuxtからLaravelのAPIに対してリクエストを送信
- Laravel側で、送受信者の情報・メッセージの内容などをDBに登録
- 受信者・送信者の情報をDBから取得
- 受信者に対してメールを送信
- ユーザー側の画面に送信されたメッセージを反映
※TwitterのDMのようなイメージです
現状、メールを送信することはできたのですが、メール送信を待ってから画面への反映が行われるため、システム内のメッセージ画面の動きが物凄くもっさりとしてしまいました。
「4」を外した状態(直書きのメールアドレスに送信)でも処理に時間がかかったため、「5」が遅いのではないかと思っています。
Nuxt側でメール送信を待たずに画面が更新されればと思い、上記の流れのうち「4」「5」をLaravelのMiddlewareに書き出して実行していましたが、特に画面反映までのスピードに変化が見られません。
LaravelのMiddlewareの使い方を理解しきれていない可能性が高いですが、どのように実装すれば「4」「5」の工程を裏で動かしつつ、画面反映させることができるのでしょうか。
★Nuxt:送信ボタン押下時の処理
async sendMessage(authorId) { let user = this.$auth.user if (this.form.text) { const valid = await this.$validator.validate() if (valid) { this.$loading.show(); let response = this.$axios.$post("/messages/create", { authorId, body: JSON.stringify({format: 'text', mediaThumbnail: '', mediaURL: '', body: this.form.text}), }).then((response) => { if (response.updateExistFlag) { this.timeline = response.timeline.slice().reverse(); this.form.text = ''; } }); } } this.scrollToEnd(); this.$loading.hide(); },
◆Laravel:メッセージのコントローラー
class MessageController extends Controller { public function __construct() { $this->middleware('receive.message.send', ['only' => ['store']]); //storeでだけmiddlewareを実行させる } //新規メッセージ作成時の処理 public function store(Request $request) { (省略) }
◆Laravel:Kernel.php
protected $routeMiddleware = [ (省略) 'receive.message.send' => \App\Http\Middleware\ReceiveMessageSend::class, ];
◆Laravel:ReceiveMessageSendの内容
<?php namespace App\Http\Middleware; use Closure; use App\Mail\ReceiveMessage; use App\Account; use DB; use Mail; use JWTAuth; class ReceiveMessageSend { public function handle($request, Closure $next) { $response = $next($request); //受信者の情報をDBから取得 $receiverInfo = Account::where([ ['delete_flag', 0], ['account_id', $request->authorId], ])->first(); //送信者の情報をDBから取得 $senderInfo = Account::where([ ['delete_flag', 0], ['account_id', JWTAuth::user()->account_id], ])->first(); //必要な情報を格納 $url = env('USER_SITE_HOST', 'https://www.XXXXXX.com/') . "mypages/messages?accountName=" . $senderInfo->display_name; $mailContent = [ "send_user_name" => $senderInfo->display_name, "message_url" => $url, ]; //メールを送信 Mail::to($receiverInfo->mail)->send(new ReceiveMessage($mailContent)); return $response; } }
回答1件
あなたの回答
tips
プレビュー