und*_*ack 28 php zend-framework initialization
我认为执行的顺序是init(),preDispatch()然后调用action().
我应该在init()或preDispatch()中初始化我的所有操作中常见的变量吗?我见过有人使用这两个函数进行初始化.可能顾名思义它应该在init()中完成,但是在preDispatch()中会有什么样的东西?
init()和preDispatch()函数调用之间会发生什么?
Emi*_*nov 28
首先preDispatch()是调用实例Zend_Controller_Plugin_Abstract.这里有请求和响应对象,因此您可以使用请求中的信息过滤请求或进行一些准备.
init()的Zend_Controller_Action被称为下一个作为构造函数的一部分.它可以帮助您初始化控制器,而无需覆盖和重复构造函数的签名(Zend_Controller_Action::__contruct()).
preDispatch()这里调用控制器的方法.您可以调用$request->setDispatched(false)以跳过当前操作 - 不确定您是否可以执行此操作init()
然后调用您的action方法(viewAction()例如).在这里,您可以正常工作,例如从模型中获取内容并填充视图.
所以区别现在应该是明确的:
preDispatch()有routeStartup和其他人),init或者preDispatch(),
init()和preDispatch()函数调用之间发生了什么?
几乎没有 - preDispatch()执行,如果你没有调用$request->setDispatched(false),则执行动作.
所述的init()方法主要用于延伸的构造.通常,构造函数应该只设置对象状态,而不是执行太多逻辑.这可能包括初始化控制器中使用的资源(例如模型,配置对象等),或分配从前端控制器,引导程序或注册表检索的值.
在preDispatch()方法的方法也可以用来设置对象或环境(例如,视图,动作助手等)的状态,但其主要目的是使有关请求的动作是否应该派遣决定.如果没有,那么你应该_forward to another action,或者抛出异常.
注意:从init()执行时,_forward实际上无法正常工作,这是两种方法意图的形式化.