我认为执行的顺序是init(),preDispatch()然后调用action().
我应该在init()或preDispatch()中初始化我的所有操作中常见的变量吗?我见过有人使用这两个函数进行初始化.可能顾名思义它应该在init()中完成,但是在preDispatch()中会有什么样的东西?
init()和preDispatch()函数调用之间会发生什么?
Emil Ivanov.. 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)
,则执行动作.
首先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实际上无法正常工作,这是两种方法意图的形式化.