LaravelでEventを使う

ユーザー登録時や退会時など特定のイベントの時に発火させたいメソッドを管理したい時はイベントリスナーを使うと便利です。

今回は基本的なイベントとリスナーの定義の仕方についてはすっ飛ばし、一つのリスナークラスで複数のイベントを設定できるイベント購読について扱います。

環境

  • 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のリポジトリやドキュメントをご覧ください。

#参考