Zend Framework:控制器对象中init()和preDispatch()函数有什么区别?

时间:2010-02-02 08:43:15

标签: php zend-framework initialization

我认为执行的顺序是init(),preDispatch()然后调用action()。

  1. 我应该在init()或preDispatch()中初始化所有操作中常见的变量吗?我见过有人使用这两个函数进行初始化。可能顾名思义它应该在init()中完成,但是preDispatch()会有什么样的东西?

  2. init()和preDispatch()函数调用之间会发生什么?

3 个答案:

答案 0 :(得分:28)

preDispatch()的实例调用第一个Zend_Controller_Plugin_Abstract。这里有请求和响应对象,因此您可以使用请求中的信息过滤请求或进行一些准备。

init()

Zend_Controller_Action作为构造函数的一部分被调用。它可以帮助您初始化控制器,而无需覆盖和重复构造函数的签名(Zend_Controller_Action::__contruct())。

此处调用控制器的preDispatch()方法。您可以致电$request->setDispatched(false)跳过当前操作 - 不确定是否可以在init()中执行此操作

然后调用您的操作方法(例如viewAction())。在这里,您可以正常工作,例如从模型中获取内容并填充视图。

所以区别现在应该是明确的:

  • 如果您希望在所有操作之前执行某些操作 - 将其放入插件并使用其中一个挂钩(preDispatch()routeStartupothers),
  • 如果您想在控制器中的每个操作之前 - initpreDispatch()
  • 如果只针对一个动作 - 动作本身。
  

init()preDispatch()函数调用之间会发生什么?

几乎没有 - preDispatch()已执行,如果您尚未调用$request->setDispatched(false),则会执行该操作。

答案 1 :(得分:9)

  • init()方法主要用于扩展构造函数。通常,构造函数应该只设置对象状态,而不是执行太多逻辑。这可能包括初始化控制器中使用的资源(例如模型,配置对象等),或分配从前端控制器,引导程序或注册表检索的值。

  • preDispatch()方法也可用于设置对象或环境(例如,视图,动作助手等)状态,但其主要目的是决定是否请求的操作应该派遣。如果没有,您应该_forward进行另一个操作,或者抛出异常。


注意:_forward从init()执行时实际上无法正常工作,这是两种方法意图的形式化。

答案 2 :(得分:0)

init():在函数之前加载,所以如果要在项目的所有函数之前加载它,请将它放在bootstrap类中。如果在指定的类之前运行,请将其放在init()此类函数。

preDispatch():在前端控制器之前加载。