「PHPフレームワーク Laravel Webアプリケーション開発」の感想・備忘録9

スポンサーリンク

イベント

イベントクラスとリスナークラスの生成

app/Providers/EventServiceProviderの$listen配列にキー=イベントクラス、値=リスナークラス、を追加してからphp artisan event:generateを実行すると、イベントクラスとリスナークラスが生成される。

protected $listen = [
    \App\Events\BookBought::class => [
        \App\Listeners\BookListener::class
    ],
];

生成されたイベントクラスには以下の3つのトレイトが含まれているので、不要な場合は削除する。

  1. Dispatchable
    イベントクラス::dispatch()でイベントを発行できるようにさせたいときに利用。
  2. InteractsWithSockets
    socket.ioを使ってブラウザにイベントを通知させたいときに利用。
  3. 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つの方法がある。

  1. Eventファサード
  2. event()ヘルパ関数
  3. \Illuminate\Events\Dispatcher
  4. \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を利用する場合

  1. composer require predis/predis
  2. .envにQUEUE_DRIVER=redisを追加

ジョブクラス

ジョブクラスの生成

php artisan make:job LogGenerator
handleメソッドに処理を記述する。
handleメソッドはメソッドインジェクションが利用できる。

ジョブ追加処理

以下の5つの方法がある。

  1. dispatch()ヘルパ関数=遅延実行
  2. dispatch_now()ヘルパ関数=即時実行
  3. ジョブクラス::dispatch();
  4. Illuminate\Bus\Dispatcher
  5. 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

コメント