Laravel イベント/リスナを利用する [ShouldQueue]

2020年6月8日

PHP

イベントとはアプリケーション的に説明すれば様々なアクションのことであり、Laravelで言えばユーザー登録や商品購入、またはログイン・ログアウトなどのタイミングのことを指します。そして、それらアクションを感知し(トリガーとして)、そのタイミングに付随した処理をさせることができるのがリスナです。

 

例えばユーザー登録や商品が購入されたタイミングでメールを送信させるなどの処理は、このイベント/リスナの機能に沿って構築すれば、コードを分離させ効率よく開発することができます。

 

JavaScriptにおけるイベント/リスナ(イベントリスナー)については下記ページをご覧下さい。

イベントハンドラー/イベントリスナーについて[addEventListener]

 

 

本記事ではイベント/リスナを利用して、ユーザー登録時にメールを送信し、同時にログを残す機能を実装してみます。またShouldQueueインターフェイスによるメール送信の非同期処理を実行してみます。

 

はじめに、ユーザーの新規登録時にメールを送信する機能を実装します。Laravel(本記事ではFramework 7.14.1を利用)に備わっている認証(Auth)機能を利用します。この構築手順は本記事では説明しませんので関連ページをご覧下さい。

 

関連ページ

Laravel 6.x〜 でログイン機能を構築

 

 

 

 

mailableクラスの作成・mailtrapサービスの利用


 

まずメール送信機能を構築します。イベント・リスナ自体の説明とは関係ないので本記事では手順のみを記述していきます。mailableクラスの作成、また本記事ではメールの送信先として mailtrap サービスを利用します。それら説明は下記関連ページをご覧下さい。

 

関連ページ

Mailableでメール送信機能を実装する

 

 

mailableクラスを作成します。

 

Mailディレクトリ・HelloEmail.phpファイルが生成されるので下記のように編集します。

app/Mail/HelloEmail.php

 

メールの中身となるテンプレートを作成します。

 

resources/views/emails/contact.blade.php

 

 

.envファイルにmailtrapサービスで取得したUsernameとPasswordを設定します。.envを編集したらキャッシュのクリアを忘れないで下さい。

 

.env

 

 

イベント/リスナの登録と作成


 

EventServiceProvider.phpファイルにイベントとリスナを登録します。

 

app/Providers/EventServiceProvider.php

UserRegisteredという名前のイベント、SendEmailという名前のリスナを、キーと値の関係において設定します。

 

下記コマンドでEventsディレクトリとUserRegistered.php、ListenersディレクトリとSendEmail.phpが生成されます。

 

それぞれ下記のように編集します。

app/Events/UserRegistered.php

23行目 eventヘルパ(後述)によるイベント発行時の引数を受け取ります。イベントクラスでは利用するデータを保持します。

 

app/Listeners/SendEmail.php

実行する処理は、handleメソッドに記述します。

 

 

ユーザー登録のコントローラにおいて、ユーザー登録されたタイミングで、イベントを発行させます。

app/Http/Controllers/Auth/RegisterController.php

13行目 eventヘルパで、UserRegisteredイベントを発行しています。引数には登録されたユーザー情報を指定します。

 

 

以上でユーザー登録の際にメールが送信されるようになります。しかし、「Register」ボタンをクリックしてからログインするまで(Dashboard画面へ移行する間)、少し時間がかかることが確認できます。実際にメール送信の処理に時間がかかってしまうからです。次の項目ではこのメール送信の部分(リスナ)をキュー(Queue)の機能を利用して、非同期処理に置き換えてみます。

 

 

 

リスナのキュー(Queue)投入による非同期処理


 

キュー(Queue)自体に関する説明は下記関連ページをご覧下さい。本記事ではキュードライバとしてデータベース(MySQL)を利用します。

 

Queueを利用して非同期によるメール送信

 

まずはキューの設定をおこないます。

 

.envファイルのQUEUE_CONNECTIONをsyncからdatabaseに変更します。.envを編集したらキャッシュのクリアを忘れないで下さい。

 

リスナを保存するためのjobsテーブルのマイグレーションファイルを作成します。

 

マイグレーションを実行します。

 

キューワーカを起動します。

 

作成したSendEmailリスナに、ShouldQueueインターフェイスを追加します。

 

以上でリスナをキューに投入できるようになり、メール送信が非同期処理されるようになります。実際にユーザー登録画面で「Register」ボタンをクリックすると、すぐにDashboard画面へと遷移することが確認できます。

 

 

リスナの追加


 

一つのイベントに対して複数のリスナーを紐付けることも可能です。単純にログを出力させるリスナを追加してみます。

 

app/Providers/EventServiceProvider.php

UserRegisteredイベントに対して、LogNameリスナを追加しています。

 

下記コマンドでLogName.phpファイルが新たに生成されます。既に生成済のイベントとリスナのファイルの内容は、変更されません。

 

下記のように編集します。

app/Listeners/LogName.php

 

実際に新規ユーザー登録をすると、メール送信されると同時に、laravel.logファイルにユーザー情報が書き込まれているのが確認できます。

 

storage/logs/laravel.log

 

 

 

参照ページ


 

Laravel 7.x イベント

 

 

 

LINEで送る
Pocket

定番本
定期本
 
Copyright © 2020 思考の葉 All Rights Reserved.  プライバシーポリシー