eventイベント処理

webman/event は、コードを侵入させずにいくつかのビジネスロジックを実行し、ビジネスモジュール間のデカップリングを実現する精巧なイベントメカニズムを提供します。典型的なシナリオは、新しいユーザーが登録に成功したときに、user.register のようなカスタムイベントを発行するだけで、各モジュールがそのイベントを受信し、対応するビジネスロジックを実行することができます。

インストール

composer require webman/event

イベントの購読

イベントの購読は、ファイル config/event.php で統一的に設定します。

<?php
return [
    'user.register' => [
        [app\event\User::class, 'register'],
        // ...その他のイベント処理関数...
    ],
    'user.logout' => [
        [app\event\User::class, 'logout'],
        // ...その他のイベント処理関数...
    ]
];

説明:

  • user.register user.logout などはイベント名で、文字列型です。小文字の単語で構成し、ドット(.)で区切ることを推奨します。
  • 1つのイベントは複数のイベント処理関数に対応でき、呼び出し順序は設定した順番になります。

イベント処理関数

イベント処理関数は任意のクラスメソッド、関数、クロージャ関数などにできます。
例えば、イベント処理クラス app/event/User.php を作成します(ディレクトリが存在しない場合は自分で作成してください)。

<?php
namespace app\event;
class User
{
    function register($user)
    {
        var_export($user);
    }

    function logout($user)
    {
        var_export($user);
    }
}

イベントの発行

Event::dispatch($event_name, $data); または Event::emit($event_name, $data); を使用してイベントを発行します。例えば:

<?php
namespace app\controller;
use support\Request;
use Webman\Event\Event;
class User
{
    public function register(Request $request)
    {
        $user = [
            'name' => 'webman',
            'age' => 2
        ];
        Event::dispatch('user.register', $user);
    }
}

イベントの発行には2つの関数、Event::dispatch($event_name, $data);Event::emit($event_name, $data); があり、両者のパラメータは同じです。
違いは、emit は内部で自動的に例外をキャッチします。つまり、1つのイベントに複数の処理関数がある場合、ある処理関数で例外が発生しても他の処理関数の実行には影響を及ぼしません。
一方、dispatch は内部で自動的に例外をキャッチしないため、現在のイベントのいずれかの処理関数で例外が発生すると、次の処理関数の実行が停止し、例外がそのままスローされます。

ヒント
パラメータ $data は任意のデータを指定できます。例えば、配列、クラスのインスタンス、文字列などです。

ワイルドカードイベントリスニング

ワイルドカード登録リスナーを使用すると、同じリスナーで複数のイベントを処理できます。例えば、config/event.php に次のように設定します。

<?php
return [
    'user.*' => [
        [app\event\User::class, 'deal']
    ],
];

イベント処理関数の2番目のパラメータ $event_data を通じて具体的なイベント名を取得できます。

<?php
namespace app\event;
class User
{
    function deal($user, $event_name)
    {
        echo $event_name; // 具体的なイベント名、例: user.register, user.logout など
        var_export($user);
    }
}

イベントのブロードキャストの停止

イベント処理関数内で false を返すと、そのイベントはブロードキャストを停止します。

クロージャ関数でのイベント処理

イベント処理関数はクラスメソッドだけでなく、クロージャ関数にもできます。例えば:

<?php
return [
    'user.login' => [
        function($user){
            var_dump($user);
        }
    ]
];

イベントとリスナーの確認

コマンド php webman event:list を使用して、プロジェクトに設定されたすべてのイベントとリスナーを表示します。

サポート範囲

主プロジェクトの基本プラグインアプリプラグインも同様に event.php の設定をサポートしています。
基本プラグインの設定ファイル config/plugin/プラグインベンダー/プラグイン名/event.php
アプリプラグインの設定ファイル plugin/プラグイン名/config/event.php

注意事項

eventイベント処理は非同期ではありません。eventは遅いビジネス処理には適しておらず、遅いビジネスはメッセージキューで処理すべきです。例えば、webman/redis-queueを使用します。