konbu's blog

PHP/Ruby/Python あたりが仕事で使っている言語です。プログラミング、学習や教育ネタを書いていきます。

Laravel でイベントとリスナを実装する時に面倒な手順で対応していた

今まで Laravel でイベントとリスナを実装する時にわざわざ手間がかかるやり方をやってしまっていたという話。

laravel 5.6.36 時点の話 (結論にも書いているが、5.2 のドキュメント時点では既にこのやり方が書かれている)。

内容

今まではイベントとリスナを実装する際は make:event と make:listener を実行し、それぞれを作成、EventServiceProvider の $listen に登録という流れで作っていたが、ドキュメントを見ているとそんなやり方は面倒だからこっちでやれという天啓が書かれていた。

readouble.com

毎回ハンドラやリスナを作成するのは、当然のことながら手間がかかります。代わりにハンドラとリスナをEventServiceProviderに追加し、event:generateコマンドを使いましょう。このコマンドはEventServiceProviderにリストしてあるイベントやリスナを生成してくれます。既存のイベントとハンドラには、もちろん変更を加えません。

今まで無駄な手順を踏んでいたらしい。

<?php

...

protected $listen = [
    // 既存分
    'App\Events\OrderShipped' => [
        'App\Listeners\SendShipmentNotification',
    ],

    // 追加分
    'App\Events\Hoge\SampleEvent' => [
        'App\Listeners\Hoge\SampleListener',
    ],
];

...
$ php artisan event:generate

ドキュメントにある通り、既存分の App\Events\OrderShipped と App\Listeners\SendShopmentNotification には何も変化は起きず (既に存在している場合は何もしないという事) 、追加分のファイルが作成されていた。 また、今回追加分では namespace で Hoge を作成する用に書いてみたが、ディレクトリの生成と namespace の設定までちゃんとやってくれている事も確認できた。

イベントとリスナをセットで作成する時のオペレーションはこのやり方が一番手間がかからなさそう。

結論

event:generate 使おう。

この記事を書きながら調べてみたら自分が Laravel を使い始めた頃のバージョンである 5.2 では既に event:generate を使えと書いてあるので、どこかで局所的にやり方を覚えてしまったのかも知れない。