介绍:Zend Framework如何创建视图(一)
在Zend Framework中创建视图(view)主要有两种方法:
a、通过在index.php文件中为Zend_Controller_Front实例对象添加VeiwRenderer参数,并将其设置为true,如下图。
b、通过在index.php文件中为Zend_Controller_Front实例对象添加noVeiwRenderer参数,并将其设置为true,在Controller中进行创建。
本文主要是了解第一种情况下视图(view)是被如何创建的。
开始执行程序:
1.程序会先调用Zend_Controller_Front实例对象的dispatch方法,该方法会去判断Zend_Controller_Front实例对象中是否将ViewRenderer设置为true,在动作经纪助手中是否存在viewRenderer这个助手,如果ViewRenderer被设置为true并且动作经纪助手中不存在viewRenderer,那么将创建一个试图解析(ViewRenderer)助手,将默认值设为-80。
2.进入Zend_Controller_Action_HelperBroker_PriorityStack对象的offsetSet方法,会去判断传进来的动作助手(此刻为Zend_Controller_Action_Helper_ViewRenderer)是否属于抽象类Zend_Controller_Action_Helper_Abstract的子类,然后判断一个由助手名称为key构建的字典($_helpersByNameRef)中是否存在该动作助手的名字,如果存在将从$_helpersByNameRef和_helpersByPriority两个字典中删除该数据项。在去判断另一个传参——-80是否已经作为key存在于$_helpersByPriority中,如果存在系统将重新为该优先值赋值——遍历整个$_helpersByPriority的key集合,存在就将该传参+1,然后将+1后的值再一次扔进遍历总重新判断,直到$_helpersByPriority中不存在该key值。例如,-80存在了,那么回去判断-79是否存在,不存在的话,将-79作为_helpersByPriority中的key,动作助手作为value存入数据字典中。最后$_helpersByPriority需要遵循一个后进先出原则(LIFO),通过krsort函数将($_helperByPriority)重新排序,退出offsetSet方法。
3.回到先前的dispatch方法中,得到或实例化request、response、router和dispatcher对象。然后通过dispatcher(Zend_Controller_Dipatcher_Stanard)对象的dispatch方法去处理每个Controller和Action,由于每个Controller对象都继承Zend_Controller_Action类,在Zend_Controller_Action初始化过程中又会创建Zend_Controller_Action_HelperBroker对象,该对象在初始化过程中又将循环静态变量$_stack,该静态变量就是Zend_Controller_Action_HelperBroker_PriorityStack对象的一个实例,然后执行每个存在$_helperByPriority字典中的助手对象的init方法,此刻ViewRenderer已经存在该字典中,所以ViewRenderer的init方法,该方法将初始化视图(view)。
其实,如果我们在第1步中,未能通过那个条件判断(noViewRenderer为true或viewRenderer已经存在)那么将跳过第2步,在第3步中如果存在viewRenderer助手,那么创建view;如果不存在那么就不会创建view,所有的view讲需要开发人员手动创建。