介紹:Zend Framework如何創(chuàng)建視圖(一)
在Zend Framework中創(chuàng)建視圖(view)主要有兩種方法:
a、通過在index.php文件中為Zend_Controller_Front實例對象添加VeiwRenderer參數(shù),并將其設(shè)置為true,如下圖。
b、通過在index.php文件中為Zend_Controller_Front實例對象添加noVeiwRenderer參數(shù),并將其設(shè)置為true,在Controller中進行創(chuàng)建。
本文主要是了解第一種情況下視圖(view)是被如何創(chuàng)建的。
開始執(zhí)行程序:
1.程序會先調(diào)用Zend_Controller_Front實例對象的dispatch方法,該方法會去判斷Zend_Controller_Front實例對象中是否將ViewRenderer設(shè)置為true,在動作經(jīng)紀助手中是否存在viewRenderer這個助手,如果ViewRenderer被設(shè)置為true并且動作經(jīng)紀助手中不存在viewRenderer,那么將創(chuàng)建一個試圖解析(ViewRenderer)助手,將默認值設(shè)為-80。
2.進入Zend_Controller_Action_HelperBroker_PriorityStack對象的offsetSet方法,會去判斷傳進來的動作助手(此刻為Zend_Controller_Action_Helper_ViewRenderer)是否屬于抽象類Zend_Controller_Action_Helper_Abstract的子類,然后判斷一個由助手名稱為key構(gòu)建的字典($_helpersByNameRef)中是否存在該動作助手的名字,如果存在將從$_helpersByNameRef和_helpersByPriority兩個字典中刪除該數(shù)據(jù)項。在去判斷另一個傳參——-80是否已經(jīng)作為key存在于$_helpersByPriority中,如果存在系統(tǒng)將重新為該優(yōu)先值賦值——遍歷整個$_helpersByPriority的key集合,存在就將該傳參+1,然后將+1后的值再一次扔進遍歷總重新判斷,直到$_helpersByPriority中不存在該key值。例如,-80存在了,那么回去判斷-79是否存在,不存在的話,將-79作為_helpersByPriority中的key,動作助手作為value存入數(shù)據(jù)字典中。最后$_helpersByPriority需要遵循一個后進先出原則(LIFO),通過krsort函數(shù)將($_helperByPriority)重新排序,退出offsetSet方法。
3.回到先前的dispatch方法中,得到或?qū)嵗痳equest、response、router和dispatcher對象。然后通過dispatcher(Zend_Controller_Dipatcher_Stanard)對象的dispatch方法去處理每個Controller和Action,由于每個Controller對象都繼承Zend_Controller_Action類,在Zend_Controller_Action初始化過程中又會創(chuàng)建Zend_Controller_Action_HelperBroker對象,該對象在初始化過程中又將循環(huán)靜態(tài)變量$_stack,該靜態(tài)變量就是Zend_Controller_Action_HelperBroker_PriorityStack對象的一個實例,然后執(zhí)行每個存在$_helperByPriority字典中的助手對象的init方法,此刻ViewRenderer已經(jīng)存在該字典中,所以ViewRenderer的init方法,該方法將初始化視圖(view)。
其實,如果我們在第1步中,未能通過那個條件判斷(noViewRenderer為true或viewRenderer已經(jīng)存在)那么將跳過第2步,在第3步中如果存在viewRenderer助手,那么創(chuàng)建view;如果不存在那么就不會創(chuàng)建view,所有的view講需要開發(fā)人員手動創(chuàng)建。
浙公網(wǎng)安備 33010602011771號