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を使用します。