Model view controller 在后端模块中检查用户真实性的最佳位置,在该模块中,所有页面仅对成员可用?

Model view controller 在后端模块中检查用户真实性的最佳位置,在该模块中,所有页面仅对成员可用?,model-view-controller,zend-framework,authentication,Model View Controller,Zend Framework,Authentication,我有一个后端模块,只能由授权成员访问。所以我需要检查所有动作和所有控制器的真实性。目前,我正在控制器类中的preDispatch()函数中执行此操作。因此,它负责控制器内的所有操作。但我还是要为所有的控制器做这件事。有没有一个地方可以让我检查一下所有的控制器。所以基本上,我想要一个地方的真实性检查整个后端模块。我可以在引导中完成吗?一般惯例是为此创建控制器插件,请参阅:。您可以在bootstrap(或application.ini)中向前端控制器注册此插件。您可以将auth逻辑从控制器preDi

我有一个后端模块,只能由授权成员访问。所以我需要检查所有动作和所有控制器的真实性。目前,我正在控制器类中的preDispatch()函数中执行此操作。因此,它负责控制器内的所有操作。但我还是要为所有的控制器做这件事。有没有一个地方可以让我检查一下所有的控制器。所以基本上,我想要一个地方的真实性检查整个后端模块。我可以在引导中完成吗?

一般惯例是为此创建控制器插件,请参阅:。您可以在bootstrap(或application.ini)中向前端控制器注册此插件。您可以将auth逻辑从控制器preDispatch方法移动到插件中的preDispatch()方法中。您还需要在方法的开头添加一个检查,以查看当前模块是什么,因为您只希望在后端模块上运行身份验证检查


另一种方法是创建一个基本控制器类,其中包含所有后端模块控制器扩展的身份验证检查。但就我个人而言,我还是会选择这个插件——从长远来看,它提供了更大的灵活性。

如果您使用的是每模块引导,那么您肯定可以在那里实现。但是,我建议将其保持在控制器级别

您还可以继续使用
preDispatch()
方法,但只需将逻辑移到控制器插件中即可。这将影响每个控制器的
preDispatch()
调用

# in application.ini
resources.frontController.plugins.authenticator = MyApp_Controller_Plugin_Authenticator

# plugin class
class MyApp_Controller_Plugin_Authenticator extends Zend_Controller_Plugin_Abstract {

   public function preDispatch(Zend_Controller_Request_Abstract $request) 
   {
      // check for authenticated user
   }
}
或者,您也可以在所有其他控制器继承的基本控制器中定义逻辑。我通常是这样做的(因为我选择在需要时调用
\u setLoginRequired()


@布莱恩:这个setUp()函数什么时候调用?我必须明确地称呼它吗?我也必须调用parent::setUp()吗?对不起,setUp()应该是init()。我修好了。您应该在子类控制器中调用parent::init()。
MyApp_Controller_Base extends Zend_Controller_Action
{
   public function init()
   {
      $this->_setLoginRequired();
   }

   protected function _setLoginRequired();
   {
       // check for authenticated user
   }
}