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
    });