Zend:在执行控制器之前执行某些操作

时间:2010-11-25 22:39:33

标签: php zend-framework controllers bootstrapping

在我的Zend框架项目中,我想检查是否设置了cookie。如果是这种情况,我想使用cookie内容登录用户。

因为在调用任何控制器之前我必须自动登录,所以我试着把它放在Bootstrap中。如果用户信息有效,我想检查数据库。不幸的是,此时尚未初始化默认数据库适配器。

所以我的问题如下:在调用任何控制器并完成所有初始化/引导之后,我应该在哪里放置应该执行的东西?

2 个答案:

答案 0 :(得分:2)

我对Zend Framework没有很好的体验,但我认为您应该为GenericController创建一个自定义通用控制器,它扩展Zend_Controller_Action并将您的代码放在preDispatch()函数中。然后,所有控制器都将成为自定义控制器的子类,例如:

class GenericController extends Zend_Controller_Action{
   function preDispatch(){
      parent::preDispatch();
      // put your code here
   }
}
class FooController extends GenericController{
...
}

答案 1 :(得分:0)

使用方法:

init()
// and
preDispatch()

在你的类中实现它们,init在创建时运行,predispatch在你的动作方法之前运行iirc

api

在我上面链接的那个页面上说明了

  
    

注意:init()与preDispatch()的使用     在上一节中,我们介绍了init()方法,在本节中介绍了preDispatch()方法。它们之间有什么区别,你会采取什么行动?     init()方法主要用于扩展构造函数。通常,构造函数应该只设置对象状态,而不是执行太多逻辑。这可能包括初始化控制器中使用的资源(例如模型,配置对象等),或分配从前端控制器,引导程序或注册表检索的值。     preDispatch()方法还可以用于设置对象或环境(例如,视图,动作助手等)状态,但其主要目的是决定是否应该调度所请求的动作。如果没有,那么你应该_forward()到另一个动作,或抛出异常。     注意:从init()执行时,_forward()实际上无法正常工作,这是两种方法意图的形式化。