イベント
イベントクラスとリスナークラスの生成
app/Providers/EventServiceProviderの$listen配列にキー=イベントクラス、値=リスナークラス、を追加してからphp artisan event:generateを実行すると、イベントクラスとリスナークラスが生成される。
protected $listen = [
\App\Events\BookBought::class => [
\App\Listeners\BookListener::class
],
];
生成されたイベントクラスには以下の3つのトレイトが含まれているので、不要な場合は削除する。
- Dispatchable
イベントクラス::dispatch()
でイベントを発行できるようにさせたいときに利用。 - InteractsWithSockets
socket.ioを使ってブラウザにイベントを通知させたいときに利用。 - SerializesModels
Queueと組み合わせて非同期イベントを実行させたいときに利用。
以下のコマンドでイベントクラスとリスナークラスを生成することもできる。
イベントクラスはデフォルトではapp\Eventsに生成されるので、変更したい場合はphp artisan make:event App\\Hoge\\Events\\BookOpended
のようにする。
- php artisan make:event BookOpended
- php artisan make:listener BookListener --event BookOpended
イベント発火
以下の4つの方法がある。
- Eventファサード
- event()ヘルパ関数
- \Illuminate\Events\Dispatcher
- \Illuminate\Contracts\Events\Dispatcher
- 1の場合
\Event::dispatch(new \App\Events\BookBought(100));
- 2の場合
event(new \App\Events\BookBought(100));
※ 1はPECLのEventと名前空間が衝突する。PECLがインストールされている場合はapp.phpでエイリアスを変更する必要がある。
※ 3,4はコンストラクタインジェクションでインスタンス取得可能。
即時実行ではなくキューに追加したい場合は、リスナークラスにimplement \Illuminate\Contracts\Queue\ShouldQueue
を追加する。
(ShouldQueueインターフェースはマーカーインターフェースなので、メソッドの追加は必要ない)
これにより、イベント発火時にキューにジョブが追加される。
※ キューを使うにはRedisなどの設定が必要。
キュー
ドライバの準備
RDBMS利用する場合
標準でサポートしてるのはRDBMSを利用するドライバである。php artisan queue:table
でマイグレーションファイルを生成し、php artisan migrate
で実行する。
Redisを利用する場合
- composer require predis/predis
- .envに
QUEUE_DRIVER=redis
を追加
ジョブクラス
ジョブクラスの生成
php artisan make:job LogGenerator
handleメソッドに処理を記述する。
handleメソッドはメソッドインジェクションが利用できる。
ジョブ追加処理
以下の5つの方法がある。
- dispatch()ヘルパ関数=遅延実行
- dispatch_now()ヘルパ関数=即時実行
- ジョブクラス::dispatch();
- Illuminate\Bus\Dispatcher
- Illuminate\Contracts\Bus\Dispatcher
- 1の場合
$generator = new LogGenerator();
dispatch(generator);
- 3の場合
LogGenerator::dispatch();
※ 4,5はコンストラクタインジェクションでインスタンス取得可能。
キューの実行
php artisan queue:work
上記コマンドはコンソールを切断すると処理が停止してしまう。
nohupコマンドで実行してもよいが、Supervisorを使うと様々なプロセスを常駐プログラムとして実行することができる。
(Laravel公式マニュアルでも使われている)
yum install supervisor