Yii-events

提供:Dev Guides
移動先:案内検索

Yii-イベント

*events* を使用して、特定の実行ポイントでカスタムコードを挿入できます。 イベントにカスタムコードを添付できます。イベントがトリガーされると、コードが実行されます。 たとえば、新しいユーザーがWebサイトに登録すると、ロガーオブジェクトが *userRegistered* イベントをトリガーする場合があります。 クラスがイベントをトリガーする必要がある場合は、yii \ base \ Componentクラスから拡張する必要があります。

イベントハンドラはPHPコールバックです。 次のコールバックを使用できます-

  • 文字列として指定されたグローバルPHP関数。
  • 匿名関数。
  • ['ClassName'、 'methodName']など、文字列としてのクラス名とメソッドの配列
  • 文字列としてのオブジェクトとメソッドの配列。たとえば、[$ obj、 'methodName']
    ステップ1 *-ハンドラーをイベントにアタッチするには、 yii \ base \ Component
    on()*メソッドを呼び出す必要があります。
$obj = new Obj;
//this handler is a global function
$obj->on(Obj::EVENT_HELLO, 'function_name');
//this handler is an object method
$obj->on(Obj::EVENT_HELLO, [$object, 'methodName']);
//this handler is a static class method
$obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
//this handler is an anonymous function

$obj->on(Obj::EVENT_HELLO, function ($event) {
  //event handling logic
});

1つ以上のハンドラーをイベントに添付できます。 アタッチされたハンドラーは、イベントにアタッチされた順に呼び出されます。

ステップ2 *-ハンドラーの呼び出しを停止するには、 yii \ base \ Event
$ handledプロパティ*を true に設定する必要があります。
$obj->on(Obj::EVENT_HELLO, function ($event) {
   $event->handled = true;
});
ステップ3 *-ハンドラーをキューの先頭に挿入するには、 yii \ base \ Component
on()*を呼び出して、4番目のパラメーターにfalseを渡します。
$obj->on(Obj::EVENT_HELLO, function ($event) {
  //...
}, $data, false);
ステップ4 *-イベントをトリガーするには、 yii \ base \ Component
trigger()*メソッドを呼び出します。
namespace app\components;
use yii\base\Component;
use yii\base\Event;
class Obj extends Component {
   const EVENT_HELLO = 'hello';
   public function triggerEvent() {
      $this->trigger(self::EVENT_HELLO);
   }
}
ステップ5 *-ハンドラーをイベントから切り離すには、 yii \ base \ Component
off()*メソッドを呼び出す必要があります。
$obj = new Obj;
//this handler is a global function
$obj->off(Obj::EVENT_HELLO, 'function_name');
//this handler is an object method
$obj->off(Obj::EVENT_HELLO, [$object, 'methodName']);
//this handler is a static class method
$obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']);
//this handler is an anonymous function

$obj->off(Obj::EVENT_HELLO, function ($event) {
  //event handling logic
});