我认为执行顺序是先调用init(),然后是preDispatch(),最后调用action()。
我的变量在所有操作中都是通用的,那么我应该在init()还是preDispatch()中初始化它们?我看到有人在这两个函数中都进行了初始化。可能根据名称,应该在init()中完成,但preDispatch()中会涉及哪些内容呢?
在init()和preDispatch()函数调用之间发生了什么?
我认为执行顺序是先调用init(),然后是preDispatch(),最后调用action()。
我的变量在所有操作中都是通用的,那么我应该在init()还是preDispatch()中初始化它们?我看到有人在这两个函数中都进行了初始化。可能根据名称,应该在init()中完成,但preDispatch()中会涉及哪些内容呢?
在init()和preDispatch()函数调用之间发生了什么?
首先,对于Zend_Controller_Plugin_Abstract
的实例,将调用preDispatch()
。在这里,您拥有请求和响应对象,因此可以使用请求中的信息进行一些准备工作或筛选请求。
然后,在构造函数的一部分中,会调用Zend_Controller_Action
的init()
方法来帮助初始化控制器,而无需重复构造函数(Zend_Controller_Action::__contruct()
)的签名。
然后在这里调用控制器的preDispatch()
方法。您可以调用$request->setDispatched(false)
跳过当前操作 - 不确定是否可以在init()
中执行该操作
然后调用您的操作方法(例如viewAction()
)。在这里,您可以像平常一样从模型中获取内容并填充视图。
因此,区别现在应该是清晰的:
preDispatch()
外,还有routeStartup
和其他),init
或preDispatch()
,
init()
和preDispatch()
函数调用之间会发生什么?
几乎什么都不会发生 - 将执行preDispatch()
,如果您没有调用$request->setDispatched(false)
则执行操作。
ajaxContext
的提示,我在引用单个控制器示例时查看文档:http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelpers.contextswitch.ajaxcontext - Keyne Vianainit()方法主要用于扩展构造函数。通常,您的构造函数应该只设置对象状态,而不执行太多逻辑。这可能包括初始化控制器中使用的资源(例如模型、配置对象等),或分配从前端控制器、引导程序或注册表检索到的值。
preDispatch()方法也可以用于设置对象或环境状态(如视图、操作助手等),但其主要目的是决定是否应调度请求的操作。如果不是,则应_forward到另一个操作,或抛出异常。
init()
: 在函数之前加载,如果你想在项目的所有函数之前加载它,请将其放在引导类中。如果要在指定类的函数之前加载,请将其放在该类的init()
函数中。
preDispatch()
: 在前端控制器之前加载。