🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1075閲覧

Laravelの処理を、Nuxtの画面反映と同時に実行したい

MYG

総合スコア3

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/02/18 10:22

編集2021/02/18 10:50

前提・実現したいこと

フロント:Nuxt、バックエンド:Laravelでシステムを構築しています。

システム内のメッセージ機能で、メッセージが送信された際に受信ユーザーの登録メールアドレスにメール通知がいくようにしたいと考えています。

  1. システム内でメッセージを入力し、送信ボタンを押す
  2. NuxtからLaravelのAPIに対してリクエストを送信
  3. Laravel側で、送受信者の情報・メッセージの内容などをDBに登録
  4. 受信者・送信者の情報をDBから取得
  5. 受信者に対してメールを送信
  6. ユーザー側の画面に送信されたメッセージを反映

※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; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucom

2021/02/18 10:48

> 6. 画面に送信されたメッセージを反映 これは送信者の画面のことですよね?その辺りも明記されるとよろしいかと思います。
MYG

2021/02/18 10:49

ご指摘ありがとうございます。 修正しました。
guest

回答1

0

ベストアンサー

  1. ユーザー側の画面に送信されたメッセージを反映

送信者の画面のことかと思いますが、これを1の直後にも行うのはどうでしょうか。

「送信ボタン押下時の処理」の sendMessage メソッドの this.$loading.show(); の辺りで、メッセージの内容をタイムラインにとりあえず反映してしまうということです。

APIのレスポンスが正常ならタイムラインが最新化されるので問題無いのではないでしょうか。
エラーなら送信が失敗したとわかるような表示をする必要はありそうですが。

また、Laravelではミドルウェアよりもイベントを利用してはどうでしょうか。
メッセージが保存されたらイベントを発行し、イベントリスナーでメールを送信するかたちになります。

どのように実装すれば「4」「5」の工程を裏で動かしつつ、画面反映させることができるのでしょうか。

キューを利用するとイベントリスナーを非同期で処理させることができます。ただ、これは、キューワーカというものを実行しておく必要があり、インフラまで関わってくることになりそうです。

投稿2021/02/18 14:02

Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MYG

2021/02/19 07:03

>Laravelではミドルウェアよりもイベントを利用してはどうでしょうか。 >メッセージが保存されたらイベントを発行し、イベントリスナーでメールを送信するかたちになります。 こちらの方法で、無事に実装することができました。 誠にありがとうございました。
Lulucom

2021/02/19 07:17

解決されたようでよかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問