当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

事件(Events)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:28:49

VENT_AFTER_INSERT 事件时,这个事件处理器都会执行。在这个处理器中,可以通过?$event->sender?获取触发事件的对象。当对象触发事件时,它首先调用实例级别的处理器,然后才会调用类级别处理器。可调用静态方法yii\base\Event::trigger()来触发一个类级别事件。类级别事件不与特定对象相关联。因此,它只会引起类级别事件处理器的调用。如:use yii\base\Event;Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) { echo $event->sender; // 显示 "app\models\Foo"});Event::trigger(Foo::className(), Foo::EVENT_HELLO);注意这种情况下?$event->sender?指向触发事件的类名而不是对象实例。注意:因为类级别的处理器响应类和其子类的所有实例触发的事件,必须谨慎使用,尤其是底层的基类,如 yii\base\Object。移除类级别的事件处理器只需调用yii\base\Event::off(),如:// 移除 $handlerEvent::off(Foo::className(), Foo::EVENT_HELLO, $handler);// 移除 Foo::EVENT_HELLO 事件的全部处理器Event::off(Foo::className(), Foo::EVENT_HELLO);全局事件所谓全局事件实际上是一个基于以上叙述的事件机制的戏法。它需要一个全局可访问的单例,如应用实例。事件触发者不调用其自身的?trigger()?方法,而是调用单例的?trigger()?方法来触发全局事件。类似地,事件处理器被附加到单例的事件。如:use Yii;use yii\base\Event;use app\components\Foo;Yii::$app->on('bar', function ($event) { echo get_class($event->sender); // 显示 "app\components\Foo"});Yii::$app->trigger('bar', new Event(['sender' => new Foo]));全局事件的一个好处是当附加处理器到一个对象要触发的事件时,不需要产生该对象。相反,处理器附加和事件触发都通过单例(如应用实例)完成。然而,因为全局事件的命名空间由各方共享,应合理命名全局事件,如引入一些命名空间(例:"frontend.mail.sent", "backend.mail.sent")。

上一页  [1] [2] 


事件(Events)