ユーザー登録時や退会時など特定のイベントの時に発火させたいメソッドを管理したい時はイベントリスナーを使うと便利です。
今回は基本的なイベントとリスナーの定義の仕方についてはすっ飛ばし、一つのリスナークラスで複数のイベントを設定できるイベント購読について扱います。
環境
- laravel5.2
ディレクトリ
- app\Events・・・イベント名=クラス名としたクラスを置く(厳密な命名規則はないです)
- app\Listeners・・・イベントごとの処理(リスナー)とsubscribeメソッドの実装(後述)したクラスを置く
- app\Providers・・・イベント購読で使用するリスナーを登録するクラスを置く
- app\Controllers・・・Eventを呼び出すコントローラーおよびメソッドを用意しておく
Eventを定義する
まずはイベントを定義しましょう。 例として“ユーザー登録完了時”というイベントを作成することにします。 イベントクラスはartisanコマンドで生成することができます。
php artisan make:event UserRegistrationComplete
artisanコマンドを実行するとこのようなクラスが自動生成されます。 コンストラクタの中にはイベントで使用するデータを設定しておきましょう。
今回はユーザー登録に関わるイベントなので、Userモデルを呼び出しておくことにします。ここで呼び出したデータはリスナークラスで使用することができます。
ちなみにbroadcastOnというのは、リアルタイムに実行したいユーザーインターフェースを実装したい時に使用するものなので今回はスルーです。
Listenerを定義する
次にリスナーを定義しましょう。 リスナーもartisanコマンドで生成することができます。
php artisan make:listener UserAuthEventListenerListener --event UserRegistrationComplete
リスナーを生成するときは、eventオプションで結び付けたいイベントを設定することができます。
イベント購読は、一つのリスナークラスに複数のイベントを設定できるので、リスナー名は複数あるイベントのカテゴリー名のような形で命名すると良いでしょう。
今回の例でいくと、“ユーザー登録完了イベントはユーザー認証のグループに属す”といったところでしょうか。
生成したリスナーでイベント発火時の処理とイベント購読の登録を行います。
イベント追加したい場合は、先ほどのartisanコマンドでイベントを生成してやればOKです。
EventServiceProviderにイベント購読クラスを登録
登録ばっかりでややこしいかと思いますが、これで最後です。 app\Providersにデフォルトで存在しているEventServiceProviderを使用します。
サービスプロバイダというのはアプリケーションの初期起動処理を行うクラスです。詳しくはドキュメント
Fire
さて、イベント購読の登録が完了したら後は自由にイベントを発火させましょう。
イベントを発火させるには、Eventファサードとfireメソッドを使います。
fireメソッドにはイベントのインスタンスを渡してあげます。
こんな感じで登録したイベントが火を吹きます :fire:
まとめ
イベント定義(データ保持)→リスナー定義(イベントで使用するメソッド管理とsubscribeメソッド実装)→イベント購読登録→:fire:
追記
Laravel5.3からNotificationというパッケージが導入されたので今回のような通知の管理はNotificationを利用した方が楽かもしれません。 そういった意図があるのか、5.3ではEventやListener, Jobとったディレクトリがデフォルトでは存在しなくなりました。 気になる方はLaravelのリポジトリやドキュメントをご覧ください。