🎉
【随時更新】Laravelのイベント&リスナーを使ってみる
laravel6を使ってイベントとリスナーを使いたいと思います。
参考
方法1 EventServiceProviderのlistenプロパティに登録するやり方
1-1 イベントとリスナーを作成
まずapp/Providers/EventServiceProviderに以下のようにイベントとリスナーを登録
EventServiceProvider.php
protected $listen = [
'App\Events\greetEvent' =>[
'App\Listeners\greetEventLister'
]
];
artisanコマンドを実行
php artisan event:generate
成功すると以下のように表示されます。
Events and listeners generated successfully!
また
php artisan event:list
とすると今アプリに登録されているイベントとリスナーを確認することができます。
1-2 イベントを実装
greetEvent.php
<?php
namespace 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 greetEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public $greet;
public function __construct($greet)
{
$this->greet = $greet;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
1-3 リスナーを実装
greetEventListener.php
<?php
namespace App\Listeners;
use App\Events\greetEvent;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class greetEventLister
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param greetEvent $event
* @return void
*/
public function handle(greetEvent $event)
{
dd($event->greet);
}
}
1-4 イベントを発火
コントローラー内で以下のようにイベントを発火します。
//省略
event(new greetEvent('こんにちは!'));
//省略
greetEventが発火したとき、それに対応したgreetEventListenerのhandleが実行されます。
方法2 イベントディスカバリを利用する
訳すとイベント発見! わかりやすい。どう言うことかというとEventServiceProviderの$listen配列にイベントとリスナーを登録しなくても、イベントとリスナーを使えることができます。
php artisan make:event greetEvent2
php artisan make:listener greetEvent2Listener
handleの引数にイベントを指定します
greetEvent2Listener
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use app\Events\greetEvent2;
class greetEvent2Listener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle(greetEvent2 $event)
{
//
}
}
そしてEventServiceProviderでshouldDiscoverEventsをオーバーライドする。そうすることで自動的にListenersディレクトリをスキャンしてイベントとリスナーを登録してくれます。
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
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
// Registered::class => [
// SendEmailVerificationNotification::class,
// ],
// 'App\Events\ItemEvent' => [
// 'App\Listeners\ItemEventLister'
// ],
'App\Events\greetEvent' =>[
'App\Listeners\greetEventLister'
]
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
public function shouldDiscoverEvents()
{
return true;
}
}
php artisan event:list
で登録されていることを確認することができます。
Discussion