Laravel 5.0 イベント

基本的な使用法

Laravelのイベント機能は、オブザーバのシンプルな実装を提供します。アプリケーションの中でイベントを発行し、購読するために使用します。イベントクラスは通常、app/Eventsディレクトリーへ保存され、ハンドラーはapp/Handlers/Eventsに設置します。

新しいイベンクラスは、Artisan CLIツールを使用して生成します。

php artisan make:event PodcastWasPurchased

イベントを購読する

Laravelアプリケーションに含まれているEventServiceProviderは、イベントハンドラーを全部登録するために便利な手段を提供しています。listenプロパティは全イベント(キー)とハンドラー(値)で構成されている配列です。もちろん、アプリケーションで必要とされているイベントをこの配列に好きなだけ追加できます。例えば、PodcastWasPurchasedイベントを追加してみましょう。

/**
 * アプリケーションのイベントハンドラーをマップする
 *
 * @var array
 */
protected $listen = [
    'App\Events\PodcastWasPurchased' => [
        'App\Handlers\Events\EmailPurchaseConfirmation',
    ],
];

イベントハンドラーを生成するには、handler:event Artisan CLIコマンドを使用します。

php artisan handler:event EmailPurchaseConfirmation --event=PodcastWasPurchased

ハンドラーやイベントが必要になるごとに毎回、make:eventhandler:eventコマンドを実行するのは、もちろん手間がかかります。代わりに、ハンドラーとイベントをEventServiceProviderに追加し、event:generateコマンドを使いましょう。このコマンドはEventServiceProviderにリストしてあるイベントやハンドラーを生成してくれます。

php artisan event:generate

イベントの発行

これでEventファサードを使用し、イベントを発行する用意ができました。

$response = Event::fire(new PodcastWasPurchased($podcast));

アプリケーションの中で、次に何を起こすかをコントロールするために、fireメソッドはレスポンスの配列を返します。

イベントを起こすために、eventヘルパを使用することもできます。

event(new PodcastWasPurchased($podcast));

クロージャーのリスナー

イベントを購読するために、独立したクラスを作成する必要は全くありません。例えば、EventServiceProviderbootメソッドの中で、以下のように指定できます。

Event::listen('App\Events\PodcastWasPurchased', function($event)
{
    // イベントの処理…
});

イベントの伝播の停止

場合により、イベントが他のリスナーへ伝播されるのを止めたいこともあります。ハンドラーから、falseを返してください。

Event::listen('App\Events\PodcastWasPurchased', function($event)
{
    // イベントの処理…

    return false;
});

キュー済みイベントハンドラー

イベントハンドラーをキューに投入する必要があるのですか?ハンドラーを生成する時に、--queuedフラッグを付けるだけです。

php artisan handler:event SendPurchaseConfirmation --event=PodcastWasPurchased --queued

これにより、ハンドラークラスへIlluminate\Contracts\Queue\ShouldBeQueuedインターフェイスが実装されます。これだけです!これで、このハンドラーがイベントにより呼び出されると、イベントデスパッチャーにより自動的にキューへ投入されます。

キューされたハンドラーの実行時に、例外が投げられなければ、そのキューは処理後自動的に削除されます。もし、deletereleaseメソッドへ手動でアクセスする必要があるのなら、どうぞそうしてください。デフォルトでキューハンドラーに含まれている、Illuminate\Queue\InteractsWithQueueトレイトが、そうしたメソッドへのアクセスを提供しています。

public function handle(PodcastWasPurchased $event)
{
    if (true)
    {
        $this->release(30);
    }
}

既に存在しているハンドラーをキューへ投入するハンドラーに変更したい場合は、ShouldBeQueuedインターフェイスをそのクラスに追加するだけです。

イベント購読クラス

イベント購読クラスの定義

イベント購読クラスは一つのクラスで多くのイベントを購読するためのものです。購読クラスは、イベントデスパッチャーインスタンスが渡されるsubscribeメソッドを実装しなくてはなりません。

class UserEventHandler {

    /**
     * ユーザーログインイベントの処理
     */
    public function onUserLogin($event)
    {
        //
    }

    /**
     * ユーザーログアウトイベントの処理
     */
    public function onUserLogout($event)
    {
        //
    }

    /**
     * イベント購入リスナーの登録
     *
     * @param  Illuminate\Events\Dispatcher  $events
     * @return void
     */
    public function subscribe($events)
    {
        $events->listen('App\Events\UserLoggedIn', 'UserEventHandler@onUserLogin');

        $events->listen('App\Events\UserLoggedOut', 'UserEventHandler@onUserLogout');
    }

}

イベント購読クラスの登録

イベント購読クラスを定義したら、Eventクラスで登録しましょう。

$subscriber = new UserEventHandler;

Event::subscribe($subscriber);

また、Laravelのサービスコンテナを使用し、購読クラスを依存解決したい場合もあるでしょう。その場合でもsubscribeメソッドへ、購読クラスの登録名を渡すだけです。

Event::subscribe('UserEventHandler');

ドキュメント章別ページ

Artisan CLI

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる