yii2中的事件和行为
Event 事件
事件是為了解耦...
注冊事件
使用"on add"添加屬性,注冊事件 使用on方法注冊事件. 第三個(gè)參數(shù)$data是監(jiān)聽函數(shù)使用的參數(shù), 第四個(gè)$append參數(shù)設(shè)置為false則把改事件的方法給添加到最前面,會先觸發(fā) 事件種類: 匿名函數(shù):function($event){} 對象方法:[$object,"handleAdd"] 靜態(tài)類方法:["Page","handleAdd"] 全局函數(shù):"handleAdd"
namespace frontend\tests;use yii\base\Component;class EventTest extends Component{}$a = new EventTest();$p = "on add";$a->$p = function($event){print "匿名函數(shù)";}function add($event){print "全局函數(shù)";}$a->on("add", "add");$a->trigger("add");觸發(fā)事件
觸發(fā)事件的時(shí)候,會傳送一個(gè)$event對象給監(jiān)聽函數(shù).該事件對象有sender.name.$handled和data以及$_events屬性 sender 就是組件本身,事件的發(fā)送者 name 事件名稱 handled 設(shè)置該屬性可以阻止事件的繼續(xù)觸發(fā)..比如判斷登錄錯誤.驗(yàn)證一個(gè)事件時(shí)出現(xiàn)錯誤.把這個(gè)設(shè)置為true.就不會繼續(xù)傳播了 $_events 存儲的數(shù)據(jù)是$_events[$name][$class] 事件名...類名..最后會根據(jù)類名再循環(huán)找到所有的父類的事件
$this->ensureBehaviors(); //確保自身behaviors()函數(shù)中的行為被添加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 handledif ($event->handled) { //如果false則直接返回return;}}}// invoke class-level attached handlersEvent::trigger($this, $name, $event);//執(zhí)行事件本身的events,注意最后一步,你可以為某個(gè)有繼承關(guān)系的類自定義一個(gè)事件..這里會執(zhí)行父類的事件
移除事件
使用off移除事件.沒什么好說的了
Behavior 行為
無論是事件還是行為,經(jīng)常能夠看到這個(gè)方法ensureBehaviors() 該方法確保該組件默認(rèn)的behaviors()方法中的組件總是被加載的... 沒弄明白,yii作者為什么這么寫...放在構(gòu)造函數(shù)中執(zhí)行一次不是更好...
行為的使用
- 1.行為中的屬性,在該類中也可以使用
- 2.行為中的方法,在該類中也可以使用
- 3.繼承與Behavior類的行為,會將其自身的$_events中的事件綁定到該類
注冊行為
attachBehavior,attachBehaviors 這兩個(gè)首先會執(zhí)行ensureBehaviors()確保自身的行為一定會被加載..
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的yii2中的事件和行为的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gulp学习笔记,基本使用流程,基本函数
- 下一篇: hadoop--日志聚集功能的配置