【Laravel】EventとListenerについて
仕事で既存の機能に新しい機能を追加しようと思っていた時に、既存の機能に「Event」などとこうものがあった。
初めて聞いた用語だったので、どのようなものなのか調べてみた。
Eventに対してListener
僕が見たコードはEventしかなかったが、実はこのEventというのはListenerというヤツとセットになっている。
一心同体である。
簡単に言うと、Eventはイベント発火の「合図」の役割を担っている。
それに対して、Listenerはその合図を実際に感知してイベントを「実行」する役割を担っている。
Eventの長所の1つは、1つのEventが複数のListenerを実行させることができる点である。
それを紐づけるEventServiceProvider
先ほど紹介したEventとListenerは勝手に連動してイベントを実行するわけではない。
これらは今紹介している「EventServiceProvider」によって紐づけられ、特定にEventには特定の Listenerが実行されるようになっている。
Eventの書き方
通常Eventはapp/Events
ディレクトリに書く。
デフォルトの状態ではEventsディレクトリは存在しないかも知れないが、Atrisanコマンドによって簡単に生成できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php use App\User; // 以下略 class UserRegistered { use Dispatchable, InteractsWithSockets, SerializesModels; public $user; public function __construct(User $user) { $this->user = $user; } } |
正直よく分からん。
Listenerの書き方
一方でListenerは通常app/Listenersディレクトリに書く。
artisanによって生成されるListenerファイルはhandleメソッドがデフォルトで用意されている。
このhandleメソッドにはEventによって実際に実行される内容を書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Listeners; use App\Events\UserRegistered; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Mail; use App\Mail\WelcomeMail; class SendWelcomeEmail { public function __contruct() { // } public function handle(UserRegistered $event) { Mail::to($event->user->email)->send(new WelcomeMail()); } } |
EventServiceProviderに書き方
EventServiceProviderファイルはApp\Providers
ディレクトリに書く。
ここにlistenプロパティに、実際に紐づけたEventとListenerを書いていく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Providers; use App\Events\UserRegistered; use App\Events\SendWelcomeEmail; use App\Events\RegisterMailMagazine; class EventServideProvider extends ServiceProvider { protected $listen = [ UserRegisterd::class => [ SendWelcomeEmail::class, RegisterMailMagazine::class, ], // 続く ]; public function boot() { parent::boot(); // } } |
Eventを発火させる
- Event(発火)
- Listener(実行)
- EventServiceProvider(紐付け)
の3つを完了したから、あとは最初の発火をさせるコードを書くだけ。
例えばRegisterController.phpのcreateメソッドの中でeventヘルパー関数を使って、イベントを発火させるとする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php use App\Events\UserRegistered; protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']) ]); event(new UserRegister($user)); return $user; } |
こんな感じでEventを実行させたいタイミングでeventヘルパー関数を用いると、Eventが発火して、Listenerが内容を実行してくれる。
-
前の記事
間違えた内容をcommitしちゃった(泣)特定のcommitだけ取り消す方法 2021.11.04
-
次の記事
新しく始めたプロジェクトをGitHubで開始する方法 2021.11.24