2012-02-03 49 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檢查認證,但我想我會離開我的反正