Yii - 事件
您可以使用事件在某些执行点注入自定义代码。您可以将自定义代码附加到事件,当触发事件时,代码就会执行。例如,当新用户在您的网站上注册时,记录器对象可能会触发userRegistered事件。如果某个类需要触发事件,您应该从 yii\base\Component 类扩展它。
事件处理程序是 PHP 回调。您可以使用以下回调 −
以字符串形式指定的全局 PHP 函数。
匿名函数。
类名和方法的数组(以字符串形式),例如 ['ClassName', 'methodName']
对象和方法的数组(以字符串形式),例如 [$obj, 'methodName']
步骤 1 − 要将处理程序附加到事件,您应该调用 yii\base\Component::on() 方法。
$obj = new Obj; // 此处理程序是一个全局函数 $obj->on(Obj::EVENT_HELLO, 'function_name'); // 此处理程序是一个对象方法 $obj->on(Obj::EVENT_HELLO, [$object, 'methodName']); // 此处理程序是一个静态类方法 $obj->on(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']); // 此处理程序是一个匿名函数 $obj->on(Obj::EVENT_HELLO, function ($event) { // 事件处理逻辑 });
您可以将一个或多个处理程序附加到事件。附加的处理程序按照它们附加到事件的顺序调用。
步骤 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; // 此处理程序是一个全局函数 $obj->off(Obj::EVENT_HELLO, 'function_name'); // 此处理程序是一个对象方法 $obj->off(Obj::EVENT_HELLO, [$object, 'methodName']); // 此处理程序是一个静态类方法 $obj->off(Obj::EVENT_HELLO, ['app\components\MyComponent', 'methodName']); // 此处理程序是一个匿名函数 $obj->off(Obj::EVENT_HELLO, function ($event) { // 事件处理逻辑 });