事件可以将自定义代码“注入”到现有代码中的特定执行点。将自定义代码附加到事件,当事件被触发时,代码将自动执行。在处理复杂的任务时,事件可以起到很好的解耦作用。与硬编码方式相比,事件也增加了服务器资源开销,所以建议在任务比较复杂的时候使用事件!以下是示例代码,代码中有详细的注释:控制器;类EventTestController扩展控制器{constBEFORE_SEND='before_send_msg';constAFTER_SEND='after_send_msg';publicfunctioninit(){parent::init();//TODO:更改自动生成的存根$this->registerEventHandler();}/***事件注册*/privatefunctionregisterEventHandler(){//事件处理类$msgHandler=newMsgHandler();//绑定事件时,可以传入第三个参数。参数值会保存在Event类的data属性中$this->on(self::BEFORE_SEND,[$msgHandler,'beforeSendMsg'],'who');$this->on(self::AFTER_SEND,[$msgHandler,'afterSendMsg']);}/***测试方法*/publicfunctionactionIndex(){//发送信息前的事件类$msgBefore=newMsgBeforeEvent();$msgBefore->date=date('Y-m-dH:i:s',time());//在发送信息前触发事件,传入事件类的实例对象,其中该对象起到存储临时数据的作用$this->trigger(self::BEFORE_SEND,$msgBefore);//假设这是一个更复杂的任务echo"Sendinformation...\n";//任务执行后,发送信息后调用事件$msgAfter=newMsgAfterEvent();$msgAfter->from='杰克';$msgAfter->to='Lucy';$msgAfter->message='太棒了';//发送消息后触发事件$this->trigger(self::AFTER_SEND,$msgAfter);}}个人认为事件处理类可以直接放在models目录下。如果不需要使用数据库操作,可以考虑直接继承Modeldate.',extraMsg:'.$event->data."\n";//写入文件file_put_contents('log.txt',$logContent,FILE_APPEND);}/***发送消息后处理事件*@paramMsgAfterEvent$event*/publicfunctionafterSendMsg(MsgAfterEvent$event){/***从事件中读取数据*/$logContent="AFTER!".$event->from.'发送到'.$event->to.',内容如下:'.$event->message."\n";file_put_contents('log.txt',$logContent,FILE_APPEND);}}消息发送前的事件类可以放在models目录
