YII事件

来源:互联网 发布:西门子300plc编程实例 编辑:程序博客网 时间:2024/05/22 07:55
以下内容文字来源于请猛戳这里,对于学习Yii本人认为十分有帮助,代码来自于Yii源码!!!!
小结:
(1)对于事件的定义,提倡使用const 常量的形式,可以避免写错。
(2)在作为handler时,要慎重使用匿名函数。只有在确定不需要解除时,才可以使用,以免日后解除绑定时麻烦。
(3)事件的触发,需要调用 yii\base\Component::trigger()

public function trigger($name, Event $event = null)
{
$this->ensureBehaviors();
if (!empty($this->_events[$name])) {
if ($event === null) {
$event = new Event;
}
if ($event->sender === null) {
$event->sender = $this;
}
$event->handled = false;
$event->name = $name;
foreach ($this->_events[$name] as $handler) {
$event->data = $handler[1];
call_user_func($handler[0], $event);
// stop further handling if the event is handled
if ($event->handled) {
return;
}
}
}
// invoke class-level attached handlers
Event::trigger($this, $name, $event);
}

public function ensureBehaviors()
{
if ($this->_behaviors === null) {
$this->_behaviors = [];
foreach ($this->behaviors() as $name => $behavior) {
$this->attachBehaviorInternal($name, $behavior);
}
}
}

private function attachBehaviorInternal($name, $behavior)
{
if (!($behavior instanceof Behavior)) {
$behavior = Yii::createObject($behavior);
}
if (is_int($name)) {
$behavior->attach($this);
$this->_behaviors[] = $behavior;
} else {
if (isset($this->_behaviors[$name])) {
$this->_behaviors[$name]->detach();
}
$behavior->attach($this);
$this->_behaviors[$name] = $behavior;
}
return $behavior;
}

0 0