2019/10/14これを読めばLaravelのイベントとリスナーが設定できるLaravelではEvent(イベント)/Listener(リスナー)を設定した場合、アプリケーションの中でイベントが発生するとそのイベントを監視しているリスナーがイベントの発生を検知し、予め決められている処理を実行することができます。何かの処理をトリガーにして別の処理を行うことができます。新規のユーザがユーザ登録を行うとアプリケーション側で登録イベント(ユーザの登録が完了したよという信号を送る)を発生させます。ユーザ登録より登録イベントが発生することを事前に知っているリスナーがその登録イベントを検知し、登録ユーザへのWelcomeメール送信、メルマガへの登録や管理者へのSlack送信などの処理を行うといったものです本文書ではLaravelのイベントを使う場合と使わない場合で動作確認を行うことでイベントの理解だけではなくイベントの利点についても解説していきます。Discovery)なぜイベントを使うのか?本書ではユーザ登録後に行うメール送信やメルマガ登録をイベントを利用して行います。それらの処理はイベントを使用しなくても作成することができますがイベントを利用することでコントローラー(メインのファイル)に記述するコード量が少なくなる上、メール送信、メルマガ登録という処理を別のクラス(別ファイル)にわけることでコードのメンテナンスが楽になります。新たにSlack送信という処理を追加することになってもコントローラー(メインのファイル)のコード変更を行うことなく他への影響を最小限に抑えて処理の追加を行うことができます。不要になった処理の削除についてもコントローラーとは別に処理毎に作成されているので削除を簡単に行うことができます。イベントがある場合ない場合の違いイベントを使わない場合と使った場合の上記の図を念頭においてイベントを理解していきましょう。環境の構築イベントとリスナーの動作確認を行うためには、Laravel環境の構築を行う必要があります。Laravelのインストールやデータベースの設定のみではなくメールマガジンを送信するメールアドレスを保存するテーブル、メール送信の機能の設定も行います。Laravelのインストールと設定composerコマンドでLaravelのインストールを行います。データベースにはsqliteを利用します。touchコマンドでデータベースファイルを作成します。コマンドはLaravelのインストールディレクトリで実行します。database/database.sqlite.envファイルでデータベースの設定をmysqlからsqliteに変更します。DB_CONNECTION=sqliteDB_CONNECTION以外のデータベースに関わる設定は削除します。ユーザの登録作業を行うために認証機能が必須となります。make:authコマンドを実行し認証機能の追加を行います。successfully.メールマガジン登録用のテーブルを作成します。make:modelコマンドでMailMagazineモデルを作成します。-mオプションをつけることで同時にマイグレーションファイルも作成します。2019_08_20_112646_create_mail_magazines_tableマイグレーションファイルには、メールマガジンに登録するメールアドレス列のみ作成します。migrateコマンドでテーブルの作成を行います。mail_magazinesテーブルの3つが作成されます。seconds)メール送信のSMTP設定ユーザ登録後にWelocomeメールが送信できるようにメールの設定を行います。ここではダミーのSMTPサーバのmailtrapを利用します。.envファイルを開いてmailTrapの接続情報を設定します。XXXXXXXXXXXXXMAIL_FROM_ADDRESS=from@example.comMAIL_FROM_NAME=Exampleあわせて読みたいMailTrapのダミーのSMTPサーバ使ってテストメール送信SMTPサーバが準備できない場合はMAIL_DRIVERにlogを設定してください。送信したメールの内容がログファイルに書き込まれます。ログファイルはstorage/logsの下に作成されます。あわせて読みたいこれでLaravelメール送信が完全にわかる送信するメールの内容を記述するためにMailableクラスのWelcomeMailを作成します。successfully.app¥Mailディレクトリの下にWelcomeMail.phpが作成されます。WelcomeMail.phpのbuildメソッドを下記のように書き換えます。viewメソッドで指定したemails.welcomeファイルにメールの内容を記述します。subjectメソッドはメールのタイトルです。mail');}resource¥viewsディレクトリの下にemails¥welcome.blade.phpファイルを作成します。welcome.blade.phpファイルには以下を書き込みます。ユーザ登録ありがとうございます。MailMagazineモデルの設定MailMagazineテーブルにemailの情報が追加できるようにMailMagazine.phpモデルファイルに以下を追加します。];}メールマガジン登録用の静的メソッドsubscribeも追加します。serveコマンドを実行して開発用サーバを起動してブラウザからLaravelに接続しユーザ登録画面が表示されるか確認します。ユーザ登録画面イベントを使わない場合ユーザ登録後に行うメール送信とメルマガ登録を行うコードを追加します。イベントを使わない場合で作成し、動作確認を行います。ユーザの登録の処理はApp¥Http¥Controllers¥Auth¥RegisterController.phpファイル内のcreateメソッドで行われています。メール送信とメルマガ登録処理はcreateメソッド内のユーザ登録処理の後に追加します。$user;}実際にユーザ登録画面からユーザの登録を行うとメールが送信され、MailMagazineテーブルに登録を行ったユーザのemailアドレスが登録されます。イベントを使用した場合イベントとリスナーを利用して、メール送信とメルマガ登録の処理を行います。イベント、リスナーの作成とEventServiceProviderへの登録が必要になります。先にEventServiceProviderでイベントとリスナーを登録することで一括でイベントとリスナーファイルを作成することができますが、ここでは個別に作成し作成後にEventServiceProviderへの登録を行います。一括作成方法は後半の章の”その他”の中で記述しています。make:eventコマンドを使ってイベントを作成します。ユーザの登録後のイベントなので、名前はUserRegisteredとします。successfully.実行後、ファイルはapp¥Eventsディレクトリの下に作成されるので、下記のように更新します。make:listenerコマンドで作成します。–eventオプションで対応するイベント名を指定すると作成したファイルにEventの情報が入力された状態で作成されます。–eventは必須ではありません。Welcomeメール用のリスナーとメールマガジン登録用のリスナーの2つを作成します。successfully.お互いに依存しない処理毎にリスナーを作成するため、場合によってはかなりの数のリスナーを作成することになります。Slack送信を追加したい場合はSlack送信用のリスナーを追加することになります。リスナーファイルはapp¥Listenersディレクトリの下に作成され、各ファイルに実行する処理を記述します。SendWelcomeMail.phpファイルのhandleメソッドにメール送信の処理を記述します。}}RegisterMailMagazine.phpファイルのhandleメソッドにメールマガジン登録の処理を記述します。}イベントとリスナーの登録イベントとリスナーの作成が完了したら、EventServiceProviderに作成したイベントとリスナーの情報を登録する必要があります。EventServiceProviderに登録することでイベントとリスナーの関連付けを行うことができます。関連付けを行わなければイベントが発生してもそのイベントを検知するリスナーがないため何も処理が行われません。バージョン5.8.9からはリスナーを自動で見つけてくれる機能が追加されました。説明は本文書の”その他”で行っています。$listen変数に作成したイベントとリスナーを下記のように追加します。イベントに関連付けするリスナーは配列でいくつでも設定することができます。新たにリスナーを追加した場合は$listenに追加する必要があります。}}eventの設定イベントとリスナーの作成、EventServiceProviderへの登録が完了したので、RegisterController.phpのcreateメソッドの中でユーザ登録が完了した後にeventヘルパー関数を使ってイベントを追加します。$user;}ブラウザからユーザの登録を行うとユーザ登録の処理の後にUserRegisteredイベントが発生して、SendWelcomeEmailとRegisterMailMagazineリスナーの処理が実行されます。ユーザ登録後の処理の追加ここまでの動作確認でイベントを利用しない場合でも利用する場合でも同じ処理が行えることがわかりました。メール送信とメルマガ登録の処理コードが短いため、あまりイベントの利点が感じられないかもしれません。運用後にSlackで管理者にメッセージを送る必要が出た場合を考えてみることでイベントの利点を確認していきましょう。Slackでのメッセージ送信はLaravelのNotificationを利用して行います。Notificationの設定ここではSlackの設定を行っていますが、イベント、リスナーを使用しない場合でもここで行うSlackの設定方法は同じです。URLを取得する必要があります。Notificationを利用するためにcomposerを利用して、slack-notification-channelパッケージをインストールします。RegisterUserSlackを作成します。RegisterUserSlackファイルの中では、通知方法の設定とSlackで送信したいメッセージを記述します。Slackなどを利用してユーザへの通知を行うことができます。通知をデータベースに保存することも可能です。通知なので、ちょっとしたメッセージを送る時に使用します。実行後はapp¥Notificationsディレクトリの下にファイルが作成されます。デフォルトではviaメソッドでNotificationはデフォルトではMailに設定されているので、MailからSlackに変更します。['slack'];}Slackメッセージを送信するためのtoSlackメソッドを追加します。->content('新規ユーザが登録されました。');}SlackMessageクラスを利用していますが、slack-notification-channelがインストールされていない場合はSlackMessageクラスは存在しないので利用することはできません。User.phpファイルにrouteNotificationForSlackメソッドを追加します。'https://hooks.slack.com/services/...';}これでSlackの設定は完了です。Slack用リスナーの追加作成ユーザ登録後にSlackで通知を送るためには、新規にSlack用のリスナーを追加する必要があります。successfully.作成したRegisterUserNotification.phpファイルのhandleメソッドにNotificationの処理を追加します。RegisterUserSlack());}最後にEventServiceProvider.phpファイルに作成したリスナーを追加します。],];ユーザ登録を行うとメール送信、メールマガジンへの追加、管理者へのSlack通知を行うことができるようになりました。このようにイベントを利用するとメインのRegisterControllerファイルに変更を行うことなく、処理の追加を行うことができます。不必要になった処理はEventServiceProvider.phpファイルからリスナー情報を削除するだけなのでメンテナンスも楽になります。処理の中身の変更が行った場合も処理が独立しているので、他の処理への影響を心配することなく行うことができます。event:generateコマンドで一括でイベントとリスナーのファイルの作成することができます。EventServiceProvider.phpを開いて、イベントとリスナーの名前を入力してください。この時名前空間も下記のように入力してください。event:generateコマンドを実行するとapp¥Eventsの下にOrderReceived、app¥ListenersにSendThankEmailとSendOrderEmailToAdminファイルが保存されます。successfully!モデルイベントLaravelでは、createdやdeletedなどモデル対する処理にイベントを組み込むことができます。ここまではユーザ登録後にeventヘルパー関数を使ってイベントを発生させ処理を行っていましたが、ユーザ作成後にイベントを発生させることができます。発生させたいイベントはモデルファイルに追加します。ここまではRegisterController.phpに下記を記述してeventを発生させていました。UserRegistered($user));モデルイベントを利用するとUser.phpファイルにイベントを設定することができます。$dispatchesEvent変数を使ってイベントを発生させるポイントをイベントを設定します。イベントやリスナーの作成、EventServeProvider.phpへの追加はこれまでと同様に行う必要があります。];モデルイベントを使用するとeventを設定したRegisterController.phpファイルの変更は必要ありません。restoredで組み込むことができます。Discovery)Laravelのバージョン5.8.9以降ではEventServiceProvider.phpでイベントとリスナーの関連付けを行わなくても自動でリスナーを見つけてくれる機能が追加されました。EventServiceProviderにshouldDiscoverEventsメソッドを追加しtrueを設定するだけです。true;}仕組みはapp¥Listenersディレクトリの下のリスナーファイルを確認し、handleメソッドの引数にあるイベントクラスを確認することで実現しています。下記のリスナーファイルのhandleメソッドのUserRegisteredのイベントクラスを確認します。Discovery)。