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

发布于 2024-10-05 05:38:25 字数 224 浏览 6 评论 0原文

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

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

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

In my Zend framework project I want to check whether a cookie is set. If it is the case I want to use the cookie contents to login a user.

Since it is neccessary for me to do this automatic login before any controller is called I tried to put it in the Bootstrap. There I want to check the database if the user information is valid. Unfortunately at this point the default database adapter is not yet initialized.

So my question is the following: Where do I put those stuff that should be executed before any controller is called and after all initializing/bootstrapping stuff is done?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧时模样 2024-10-12 05:38:25

我对 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{
...
}

I'have not a great experience with Zend Framework but I think you should create a custom generic controller for example GenericController that extends the Zend_Controller_Action and put your code in the preDispatch() function. All your controllers will then a subclass of your custom controller, for example:

class GenericController extends Zend_Controller_Action{
   function preDispatch(){
      parent::preDispatch();
      // put your code here
   }
}
class FooController extends GenericController{
...
}
晨与橙与城 2024-10-12 05:38:25

使用这些方法:

init()
// and
preDispatch()

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

api

在我上面链接的那个页面上它指出

<块引用>

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

Use the methods:

init()
// and
preDispatch()

implement them in your class, init runs at creation, predispatch runs right before your action method iirc

api

On that page I linked above it states

Note: Usage of init() vs. preDispatch()
In the previous section, we introduced the init() method, and in this section, the preDispatch() method. What is the difference between them, and what actions would you take in each?
The init() method is primarily intended for extending the constructor. Typically, your constructor should simply set object state, and not perform much logic. This might include initializing resources used in the controller (such as models, configuration objects, etc.), or assigning values retrieved from the front controller, bootstrap, or a registry.
The preDispatch() method can also be used to set object or environmental (e.g., view, action helper, etc.) state, but its primary purpose is to make decisions about whether or not the requested action should be dispatched. If not, you should then _forward() to another action, or throw an exception.
Note: _forward() actually will not work correctly when executed from init(), which is a formalization of the intentions of the two methods.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文