【问题标题】:Zend: Execute something before a controller is executedZend:在执行控制器之前执行某些操作
【发布时间】:2010-11-25 22:39:33
【问题描述】:

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

由于我必须在调用任何控制器之前执行此自动登录,因此我尝试将其放入 Bootstrap。如果用户信息有效,我想检查数据库。不幸的是,此时默认数据库适配器尚未初始化。

所以我的问题如下:在调用任何控制器之前以及在所有初始化/引导内容完成之后,我应该将那些应该执行的内容放在哪里?

【问题讨论】:

    标签: php zend-framework controllers bootstrapping


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了,正是我想要的!
    • 更好的方法:使用Zend_Controller_Plugins。继承控制器会使调试和配置变得更加困难。
    【解决方案2】:

    使用方法:

    init()
    // and
    preDispatch()
    

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

    api

    在我上面链接的那个页面上

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

    【讨论】:

    • 但我想在调用任何控制器之前执行我的代码。我想在调用 Controller1 之前登录用户,但也要在调用 Controller2 之前登录。
    • @ralle 总是为每个请求调用某种控制器。您必须在每个控制器上登录它们,即使您按照其他答案中的建议进行扩展,您仍然将这些方法放入其中。没有(不编辑 Zend)全局位置(除了引导程序)可以做这。就像你说的那样,因为它是用户身份验证,所以将引导程序放入其中并不是最简单的。虽然您可以在引导程序中加载数据库然后进行身份验证。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2012-11-27
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多