## Yii2事件   **[事件](http://www.yiichina.com/doc/guide/2.0/concept-events)**可以将自定义代码“注入”到现有代码中的特定执行点。附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。   例如,邮件程序对象成功发出消息时可触发 `messageSend` 事件。如想追踪成功发送的消息,可以附加相应追踪代码到 `messageSend` 事件。   Yii 引入了名为 `yii\base\Component` 的基类以支持事件。如果一个类需要触发事件就应该继承 `yii\base\Component` 或其子类。 ### 事件处理器 事件处理器是一个[PHP 回调函数](http://www.php.net/manual/en/language.types.callable.php),当它所附加到的事件被触发时它就会执行。可以使用以下回调函数之一: * 对象名和方法名数组形式指定的对象方法,如 `[$object, $method]` ; ``` use app\events\MessageEvent; ... const EVENT_HELLO = 'sayHello'; public function actionIndex() { $event = new MessageEvent; $event->message = 'new message from actionIndex method'; $this->on(self::EVENT_HELLO,[$event,'hello']); $this->trigger(self::EVENT_HELLO,$event); // 打印 new message from actionIndex method } ``` 其中`app\events\MessageEvent`类代码很简单,如下: ``` <?php namespace app\events; use yii\base\Event; use Yii; class MessageEvent extends Event { public $message; public function hello($event) { echo $event->message; } } ``` * 类名和方法名数组形式指定的**静态类方法**,如 `[$class, $method]` ; ``` use app\events\MessageEvent; ... const EVENT_HELLO = 'sayHello'; public function actionIndex() { $event = new MessageEvent; $event->message = 'new message from actionIndex method'; $this->on(self::EVENT_HELLO,['app\events\MessageEvent','hello']); $this->trigger(self::EVENT_HELLO,$event); } ``` 其中`app\events\MessageEvent`类代码很简单,如下: ``` <?php namespace app\events; use yii\base\Event; use Yii; class MessageEvent extends Event { public $message; static public function hello($event) { echo $event->message; } } ``` * 匿名函数,如 `function ($event) { ... }` 。 ``` const EVENT_HELLO = 'sayHello'; public function actionIndex() { $this->on(self::EVENT_HELLO,function ($event){ // 绑定一个Event事件 foreach ($event->data as $data){ echo strtoupper($data),PHP_EOL; } }, ['abc','dev']); $this->trigger(self::EVENT_HELLO); // 触发事件 得到结果:ABC DEV } ```