2012-02-03 119 views
1

我最近开始使用Zend Framework,并且我已经完全爱上它了,甚至为了支持而退役了自己的框架。Zend Framework重复功能

但是我错过了一些可能如此痛苦明显的事情,你会轻笑一下。

我有一个登录系统,在每个控制器中,我必须检查登录状态,我看了一下访问引导程序中的Zend会话存储,但我处于截止日期,不能能够浪费时间,有没有更好的方法来检查IE中的bootstrap?而不是在每个控制器中重复使用20多行代码和功能。

在此先感谢!

+0

同样在这里,我也探索它与Zend的是真棒......顺便说一句,你可以看看进入这可能会帮助你 - > http://stackoverflow.com/questions/2306374/show-login-form-on-every-page-using-zend-form – Rikesh 2012-02-03 09:23:41

回答

4

您可以使用一个控制器插件。请参阅:http://framework.zend.com/manual/en/zend.controller.plugins.html

class Your_Plugin_Login extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     if (!Zend_Auth::getInstance()->hasIdentity()) { 
      // send the user to the login page 
      $request->setControllerName('login') 
        ->setActionName('login'); 
     } 
    } 
} 

与任何适合你的登录页面更换控制器/动作名称,和“你”与应用程序的命名空间。

然后,您可以使用Front控制器将该插件注册到application.ini文件中,或者使用Zend_Controller_Front::getInstance()->registerPlugin(new Your_Plugin_Login());的引导程序注册该插件。

编辑:如果您想将用户详细信息视图,以及,你可以这样做:

$layout = Zend_Layout::getMvcInstance(); 
$view = $layout->getView(); 
$view->user = Zend_Auth::getIdentity(); 
+0

我其实更喜欢这个我的方法 - 真的很好,低维护混合一些功能的方法。尽管如果有用户登录,您将如何使用此方法使控制器可访问用户详细信息? – wheresrhys 2012-02-03 11:26:56

+0

您可以以类似的方式访问视图对象并将其存储在其中。我已经编辑了我的答案,以包含此示例。 – 2012-02-03 12:31:10

+0

以下是由ZF的领导程序员开发的登录窗口小部件/登录管理器的示例:http://mwop.net/blog/246-Using-Action-Helpers-To-Implement-Re-Usable-Widgets它可以轻松地适应成为控制器插件 – 2012-02-03 13:31:18

1

你可以编写自己的控制器,继承自Zend Controller(调用它,例如DaveMac_Controller - 你可以在应用程序的配置文件中定义前缀,以便应用程序可以自动加载它(并且你需要小心你保存的目录你的班级))。在这个类的构造函数中运行验证检查。然后将所有页面的控制器从DaveMac_Controller继承,而不是默认的zend继承。

如果我在家里,我可以复制和粘贴一些代码作为例子,但现在正在工作,所以希望上面的轮廓就足够了。

*编辑好醇”的Dropbox :)

的application.ini

includePaths.library = APPLICATION_PATH "/../library" 
autoloaderNamespaces[] = "DaveMac_" 

/../library/DaveMac/Controller/Action.php

<?php 

class DaveMac_Controller_Action extends Zend_Controller_Action { 


    protected $acl; 
    protected $user; 
    protected $userRole; 

    public function init() { 

     //retrieve and store user details 
     $auth = Zend_Auth::getInstance(); 
     if($auth->hasIdentity()){ 
      $user = $auth->getIdentity(); 
      $this->user = $user; 
      $this->view->user = $user; 
      $this->userRole = $user->role; 
     } else { 
      $this->userRole = "guest"; 
     } 

     //Initialise access control list 
     $this->acl = new DaveMac_Acl(); 
    } 

    protected function checkAuth($pageLevel, $redirect = "/") { 
     if($this->user) { 
      if(!$this->acl->isAllowed($this->userRole, $pageLevel)) { 
       $this->_redirect($redirect); 
      } 
    } else if ($pageLevel != DaveMac_Resources::PUBLIC_ONLY_PAGE) { 
     $this->_redirect('/login/returnurl/' . str_replace('/','-',$this->getRequest()->getRequestUri())); 
     } 
    } 
} 

你可能已经有自己的功能fdor检查认证,但我想我会离开我的反正