Rumah >pembangunan bahagian belakang >tutorial php >yii2 关于事件的疑问
在yii中的Application的run方法中,只看到各种trigger,并没有看到各种事件的绑定?请问,这些事件在哪里绑定的?
在yii中的Application的run方法中,只看到各种trigger,并没有看到各种事件的绑定?请问,这些事件在哪里绑定的?
一定要多看官方文档
事件的绑定
有了事件handler,还要告诉Yii,这个handler是负责处理哪种事件的。这个过程,就是事件的绑定, 把事件和事件handler这两个蚂蚱绑在一根绳上,当事件跳起来的时候,就会扯动事件handler啦。yiibaseComponent::on() 就是用来绑定的,很容易就猜到, yiibaseComponent::off()
就是用来解除的。对于绑定,有以下形式:
<code>$person = new Person; // 使用PHP全局函数作为handler来进行绑定 $person->on(Person::EVENT_GREET, 'person_say_hello'); // 使用对象$obj的成员函数say_hello来进行绑定 $person->on(Person::EVENT_GREET, [$obj, 'say_hello']); // 使用类Greet的静态成员函数say_hello进行绑定 $person->on(Person::EVENT_GREET, ['app\helper\Greet', 'say_hello']); // 使用匿名函数 $person->on(Person::EVENT_GREET, function ($event) { echo 'Hello'; });</code>
事件的绑定可以像上面这样在运行时以代码的形式进行绑定,也可以在配置中进行绑定。 当然,这个配置生效的过程其实也是在运行时的。原理可以参见 配置项(Configuration) 部分的内容。
上面的例子只是简单的绑定了事件与事件handler,如果有额外的数据传递给handler,可以使用
yiibaseComponent::on() 的第三个参数。这个参数将会写进 Event 的相关数据字段,即属性 data 。如:
<code>$person->on(Person::EVENT_GREET, 'person_say_hello', 'Hello World!'); // 'Hello World!' 可以通过 $event访问。 function person_say_hello($event) { echo $event->data; // 将显示 Hello World! }</code>
yiibaseComponent 维护了一个handler数组,用来保存绑定的handler:
<code>// 这个就是handler数组 private _events = []; // 绑定过程就是将handler写入_event[] public function on($name, $handler, $data = null, $append = true) { $this->ensureBehaviors(); if ($append || empty($this->_events[$name])) { $this->_events[$name][] = [$handler, $data]; } else { array_unshift($this->_events[$name], [$handler, $data]); } }</code>
绑定当然是你自己写。
比如,Yii框架会在查询成功之后触发EVENT_AFTER_FIND
事件,至于你想在查询成功之后做些什么,这是你自己的事,根据你的需要来,框架怎么会知道。所以是你来调用on
方法给事件绑定回调函数。
补充:
我说的框架不管绑定不是说框架一个事件都不绑定,而是指并不是框架触发的每个事件它自己都要绑定一下。
题主到底懂不懂事件机制啊,触发事件是为了让你去绑定方法来执行。它如果不触发,那你怎么用啊。
比如你看下面的代码,我实现了一个函数:
<code>function sum(a, b) { trigger('before_sum'); return a + b; }</code>
我一定要给before_sum
事件绑定个处理函数吗?
我的sum函数是给别人用的,我触发这个事件是为了他可以使用。他可以绑定事件以便在执行sum的时候先执行他自己的一段代码。
我自己给before_sum绑定处理函数干嘛?我想在return之前执行什么代码我直接写进去不就行了。