Laravel イベント 調べてみた

Laravelのイベントについて

Laravelのイベントとは、ある処理をトリガーとして特定の処理を実行させる機能になります。

トリガーとなる処理が行われた時に発信されるものがイベント、イベントを受けて実行する処理をリスナー、イベントを発行する機能をディスパッチャーといいます。

イベントとリスナーは特定のクラスを作成し、ディスパッチャーはeventヘルパー関数を利用します。

 

イベントとリスナーの作成

※以下のファイル名やファイル構成は1例になります。

1:サービスプロバイダの登録

App\Providers\EventServiceProvider.phpにイベントとリスナーを登録します。

EventServiceProvider.php

<?php
namespace App\Providers;

use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

class EventServiceProvider extends ServiceProvider
{
 protected $listen = [ ・・・①
   'App\Events\PostMail' => [
   'App\Listeners\NotificationSlack'
   ]
 ];

 public function boot()
 {
   //
 }
}

①listenプロパティーにイベント名をキー、リスナー名を値に設定します。

(今回はメールが投稿されたらSlackに通知する想定の処理を作成しました。が、実際の処理は実装しません。名前だけの参考程度でご認識ください)

 

2:コマンドの実行

以下コマンドを実行します。

php artisan event:generate

1で設定したイベントファイルとリスナーファイルが作成されます。

 

イベントファイルの編集

作成されたイベントファイルに必要な処理を実行します。

PostMail.php

<?phpnamespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class PostMail
{
use Dispatchable, InteractsWithSockets, SerializesModels;

 private $email;

public function __construct(string $email) ・・・①
 {
$this->email = $email;
}

public function getEmail(): string ・・・②
{
return $this->email;
}

public function broadcastOn()
 {
return new PrivateChannel('channel-name');
}
}

①コンストラクタで必要な値を取得します。

②今回はメールアドレス名を取得するメソッドを追加しました。

 

リスナーファイルの編集

作成されたリスナーファイルに必要な処理を実行します。

NotificationSlack.php

<?php
namespace App\Listeners;

use App\Events\PostMail;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class NotificationSlack
{
 public function __construct()
 {
   //
 }

 public function handle(PostMail $event) ・・・①
 {
   dd($event->getEmail());
 }
}

①handleメソッドにリスナーの処理を実装します。

メソッドインジェクションでイベントクラスを注入することでイベントクラスの実装を利用できます。

 

イベントの実行

イベントを実行するにはeventヘルパー関数を使用します。

use App\Events\PostMail; ・・・①
・
・
・
event(new PostMail('test@test.com')); ・・・②

①作成したイベントクラスをインポートします

②イベントクラスのインスタンスを作成します。

これでリスナーが実行されます。

 

以上!!!!!!!