November 30, 2014

Laravel 5のイベントリスナのアノテーションを試してみた

この機能は廃止 https://github.com/laravel/framework/commit/4d9f92ef77b3610a05f71110f539daff06e9081d されたのかもしれません。

--

Laravel 5は現在開発中です。正式リリース版では、当記事の内容と異なる可能性があります。

Laravel 5では、ルーティングだけでなく、イベントリスナもアノテーションで定義できるようになります。

細かな書き方などは、以下がとても参考になりました。
http://mattstauffer.co/blog/laravel-5.0-event-annotations

以下、サンプルです。

適当な場所に適当なクラスを作成します。
<?php namespace App\EventListeners;

use Illuminate\Contracts\Logging\Log;

class Foo
{
    protected $log;

    /**
     * @param  Log $log
     */
    public function __construct(Log $log)
    {
        $this->log = $log;
    }

    /**
     * @Hears("bar.baz")
     *
     * @param  mixed $params
     */
    public function qux($params)
    {
        $this->log->debug(print_r($params, true));
    }
}
$this->log->debug() の箇所は、Laravel 5のContractsという仕組みを用いてみましたが、ファサードを用いて\Log::debug()でも同じです。

ポイントは @Hears("bar.baz") の箇所で、従来の書き方だと以下になります。
\Event::listen('bar.baz', 'App\EventListeners\Foo@qux');
次に app/Providers/EventServiceProvider.php を編集して protected $scan をオーバーライドします。値は配列で、アノテーションをスキャンしたいクラス名を書き並べます。
protected $scan = [
    '\App\EventListeners\Foo',
];
php artisan event:scan コマンドでスキャンします。
$ php artisan event:scan
Events scanned!
storage/framework/events.scanned.php がそれっぽい内容になっていれば正しくスキャンされています。
<?php 

$events->listen(array (
  0 => 'bar.baz',
), 'App\EventListeners\Foo@qux');
また、ルーティングのアノテーションと同様に app/Providers/EventServiceProvider.php の protected $scanWhenLocal をオーバーライドしてtrueを設定すると、環境値が"local"の場合に限って、リクエストの度に自動スキャンしてくれるようになりました。
protected $scanWhenLocal = true;
適当な場所でイベントをfire()してみます。
\Event::fire('bar.baz', [['xxx', 'yyy']]);
ログにパラメータが書き出されていれば成功です。
storage/logs/laravel-{yyyy-mm-dd}.log
[2014-11-30 00:10:52] local.DEBUG: Array
(
    [0] => xxx
    [1] => yyy
)
ルーティングのアノテーションと同様、デプロイ時のスキャン忘れとかには注意が必要なのかなと思いました。

No comments:

Post a Comment