Yii - 事件



您可以使用事件在某些执行点注入自定义代码。您可以将自定义代码附加到事件,当事件触发时,代码将被执行。例如,当新用户在您的网站上注册时,日志记录对象可能会触发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
});

您可以将一个或多个处理程序附加到事件。附加的处理程序按它们附加到事件的顺序调用。

步骤 2 - 要停止处理程序的调用,您应该将yii\base\Event::$handled 属性设置为true

$obj->on(Obj::EVENT_HELLO, function ($event) {
   $event->handled = true;
});

步骤 3 - 要将处理程序插入队列的开头,您可以调用yii\base\Component::on(),并将第四个参数传递为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
});
广告