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

  • 我应该在init()或preDispatch()中初始化我所有操作中都通用的变量吗?我见过人们同时使用这两个函数进行初始化。顾名思义,它应该在init()中完成,但是preDispatch()中会放入哪种类型的东西呢?
  • init()和preDispatch()函数调用之间会发生什么?
  • 最佳答案

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

    接下来,将init()Zend_Controller_Action作为构造函数的一部分进行调用。它可以帮助您初始化 Controller ,而不必重写并重复构造函数的签名(Zend_Controller_Action::__contruct())。

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

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

    因此,区别现在应该很清楚:

  • 如果要在所有操作之前执行某些操作,请将其放入插件中并使用其中一个钩子(Hook)(preDispatch()之外还有routeStartupothers),
  • (如果要在 Controller 中的每个操作之前执行)-initpreDispatch()
  • (如果仅用于单个操作)-操作本身。



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

    10-06 05:14