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