🎉

【随時更新】Laravelのイベント&リスナーを使ってみる

2022/04/07に公開

laravel6を使ってイベントとリスナーを使いたいと思います。

参考
https://readouble.com/laravel/6.x/ja/events.html

方法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