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

2022-08-30 15:17:25

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

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

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


答案 1

对于 的实例,首先调用 。此处有请求和响应对象,因此可以使用请求中的信息筛选请求或进行一些准备。preDispatch()Zend_Controller_Plugin_Abstract

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

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

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

所以区别现在应该很清楚:

  • 如果你想在所有操作之前执行某些东西 - 把它放在插件中并使用其中一个钩子(除了有和其他的),preDispatch()routeStartup
  • 如果要在控制器中的每个操作之前 - 或者,initpreDispatch()
  • 如果只是一个动作 - 动作本身。

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

几乎什么都不执行 - 执行,如果您尚未调用 ,则执行操作。preDispatch()$request->setDispatched(false)


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

  • preDispatch() 方法还可用于设置对象或环境(例如,视图、操作帮助程序等)状态,但其主要目的是决定是否应调度所请求的操作。如果不是,则应_forward另一个操作,或引发异常。


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


推荐