はじめに
Laravelでイベント機能を実装する必要がありそうだが、
全くさわったことがないため、使い方を一から整理する。
イベント(リスナー)に実装する内容は本来ならコントローラーでも実装可能です。
ただ、コントローラーはどうしてもコード量が増えてしまうので、
なるべくコード量を減らしたいです。
そういった意味ではリスナーに記載することでコードがスッキリします。
また、コントローラーであれば複数処理をまとめて同じクラスに記載することとなりますが、
リスナーでは処理毎にクラスが分かれるので、
後々のリファクタリングも楽になります。
イベントとは
任意のタイミングで別の処理を実行させます。
例えば、
ユーザー登録やLoginなどのタイミングでイベントを発行して、メールでの通知を実行させるなど。
やること
・イベントとリスナーの定義
・イベントとリスナークラスの作成
・リスナーの実装
現状の確認
現状のイベントとリスナーの確認
app/Providers/EventServiceProvider.php内の
listenプロパティにてイベントと対応するリスナーが記載されています。
以下と同様の場合、まだ特に設定がない状態です。
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\Event' => [
'App\Listeners\EventListener',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
Auth認証周りの確認
php artisan make:auth
で認証周りを実装した場合には、
Laravel側でイベントを発行してくれています。
vendor/laravel/framework/src/Illuminate/Auth/Events内に
登録されているイベント一覧があります。
認証周りのイベントを使用する場合はここのイベント名を使用することになると思います。
今回はこのAuthのイベントのうち、PasswordResetを使用します。
リスナーの定義
app/Providers/EventServiceProvider.phpのListenプロパティに今回使用するイベントと
リスナーの組み合わせを記載します。
なお、リスナーは複数記載可能です。
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\Event' => [
'App\Listeners\EventListener',
'Illuminate\Auth\Events\PasswordReset' => [
'App\Listeners\PasswordResetListener',
],
];
通知の作成
次にコマンドからmake:listenerコマンドを打ちます。
これでapp/Listeners配下に指定したファイル名のListerクラスが作成されます。
php artisan make:listener PaswordResetListener --event=Illuminate\Auth\Events\PasswordReset
なお、今回はAuthですでにあるイベントを使用しましたが、
イベントを新規で作成する場合は
php artisan event:generate
を打つことで定義したイベントとリスナーが作成されます。
リスナーの実装
作成されたリスナーはapp/Listeners配下に作成されます。
以下が作成されたリスナークラスです。
この中のhandleメソッドが実行されるのでここを修正していきます。
親切にメール送付のコードが初期から記載されてますね。
メール送付くらいだったらこのままでも全然良いかも。
<?php
namespace App\Listeners;
use IlluminateAuthEventsPasswordReset;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;
class PaswordResetListener
{
private $mailer ;
private $eloquent;
/**
* Create the event listener.
*
* @return void
*/
public function __construct(Mailer $mailer , User $eloquent)
{
//
$this->mailer = $mailer;
$this->eloquent = $eloquent;
}
/**
* Handle the event.
*
* @param IlluminateAuthEventsPasswordReset $event
* @return void
*/
public function handle(IlluminateAuthEventsPasswordReset $event)
{
//
$email = new EmailVerification($user);
Mail::to($user->email)->send($email);
}
}
終わり