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