我正在研究'私人'應用程序,您必須登錄後才能執行任何操作。這給我一個加載Zend Navigation角色的問題。目前,我正在啓動Zend Navigation,這很好,直到我將ACL添加到Zend Nav。問題是,我想從我的auth存儲中加載'userRole',但是直到用戶登錄纔會有存儲,所以在登錄頁面中給我一個'嘗試獲取非對象屬性'警告。這是因爲在登錄之前,auth的存儲中沒有任何內容,所以auth->userRole
是'沒有',因爲auth->getInstance()->getIdentity()->???
將是空的,直到用戶登錄並且配置了auth。Zend導航:我應該在哪裏加載私人應用程序中的ACL'角色'
我沒有在登錄頁面使用Zend Nav,實際上我有一個替代的登錄頁面佈局(根本沒有導航); 'if !$auth->hasIdentity'
(false)使用登錄佈局,僅在系統範圍內顯示該問題的登錄頁面,正如我所說的,應用程序是完全私人的,因此默認爲「客人」角色或類似的東西似乎是一種「髒」的方法,因爲一旦用戶登錄,它將不得不重新配置auth。爲了取悅登錄頁面而設置通用身份驗證標識似乎不太合適。
我得到的是,移動Zend Nav'init'的好地方,還是至少移動configure ACL部分?也可以移動整個事情?
這是我在我的bootstrap.php中的Zend的導航:
protected function _initNavigation() {
$this->_logger->info('Bootstrap ' . __METHOD__);
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
這在當時是引導運行的'$role = Zend_Auth::getInstance()->getIdentity()->userRole'
是空的(或非對象)。
我所有的ACL都發生在控制器中(在動作中),或者某些時候可能發生在模型中,雖然我不會指責Web服務或任何東西,所以他們可能會留在控制器中,但我有靈活性,因爲我有在模型中的ACL(這將是'域'的權利?
我只在Zend Nav上使用ACL用於佈局,用戶體驗目的;菜單和鏈接根據用戶角色,Zend Nav將是'灰色',不存在或活動(和可見),例如'用戶'角色不會獲得許多'管理員'選項,並且這在ACL中由ACL重新實施控制器,所以不能簡單地輸入網址並獲得一個區域。
我的另一個想法是,也許我應該考慮將這種情況下的登錄名移動到引導程序中,但我不確定這是一個好主意嗎?
編輯: 這是我投入的前端控制器插件代碼:
class Plugins_Controller_ZendNavInit extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
}
}
偉大工程;當然,我必須像任何其他註冊我的插件。我也將我的Auth檢查移到了前端控制器插件上。
感謝您的回答。我會在今天下午看到它並回來。它使'默認用戶'的想法聽起來不那麼'髒':) – rhaag71 2011-04-29 16:22:09
我認爲這(你所建議的)是我將要去的解決方案,創建一種'登錄頁面'的僞角色並對待它就像它的'登錄頁面'角色一樣,在用戶登錄時會被註銷;基本上只是'cearIdentity()',然後將新的認證寫入存儲。感謝您的鏈接並花時間給出答案。 – rhaag71 2011-05-01 05:10:46
對於將來的旁觀者,我在我的原始任務(上面)中編輯了我在新的Front Controller Plugin中使用的代碼。 – rhaag71 2011-05-07 20:04:13