当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ZendFramework:控制器对象中init()和preDispatch()函数有什么区别?》经验,为你挑选了2个好方法。

我认为执行的顺序是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),则执行动作.



1> Emil Ivanov..:

首先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()`实际上,你还没有回答这个问题.从结构的角度来看,**在单个控制器**上,当应该使用init()而不是preDispatch()(不是插件)?例如:我们从未在preDispatch中看到AjaxContext助手,而是init().那两者之间的概念差异是什么?不是技术性的 如果你明白我的意思.如果你只是可以使用一个或另一个,没有区别.但我认为有一些东西.

2> ainokna..:

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

在preDispatch()方法的方法也可以用来设置对象或环境(例如,视图,动作助手等)的状态,但其主要目的是使有关请求的动作是否应该派遣决定.如果没有,那么你应该_forward to another action,或者抛出异常.


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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有