2013-07-20 51 views
0

我正在爲我的應用程序創建一個ACL。但我似乎無法找到錯誤的地方。由於它是一個簡單的ACL,我不認爲在這裏很難找到問題。我收到以下錯誤: 致命錯誤:Zend_Acl_Role_Registry_Exception:在/usr/local/zend/share/ZendFramework/library/Zend/View/Helper/Navigation/HelperAbstract.php上找不到角色'secretaria'522行 並且在此處是我的代碼(下面)。如果有人可以幫助我找到哪裏錯誤,我會明白。Zend_Acl註冊表

<?php 

class Plugins_acl extends Zend_Controller_Plugin_Abstract{ 

    //NOME DOS RESOURCES 
    //private $modules = array(); 
    //private $perfils = array(); 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
     { 
     $acl = new Zend_Acl(); 

       //create the user roles 
       //1-ADMINISTRADOR 
       //2-MEDICO 
       //3- ASSISTENTE 
       //4- SECREATRIA 
       $acl->addRole(new Zend_Acl_Role('administrador')); 
       $acl->addRole(new Zend_Acl_Role('medico')); 
       $acl->addRole(new Zend_Acl_Role('assistente')); 
       $acl->addRole(new Zend_Acl_Role('secretaria')); 
       $acl->addRole(new Zend_Acl_Role('guest')); 

       //create the resources 
       $acl->addResource(new Zend_Acl_Resource('index')); 
       $acl->addResource(new Zend_Acl_Resource('error')); 
       $acl->addResource(new Zend_Acl_Resource('dashboard')); 
       $acl->addResource(new Zend_Acl_Resource('login')); 
       $acl->addResource(new Zend_Acl_Resource('default')); 

       $acl->allow(null,'index'); 
       $acl->allow('secretaria','dashboard'); 
       $acl->allow('secretaria','index'); 
       $acl->allow('secretaria','default'); 
       $acl->allow('guest','login'); 

       $auth = Zend_Auth::getInstance(); 
       if($auth->hasIdentity()) 
        { 
         $identity = $auth->getIdentity(); 
         $role = strtolower($identity['role']); 
        } 
        else 
         { 
          $role = 'guest'; 
        } 

         $controller = $request->controller; 
         $action = $request->action; 
         $module= $request->module; 

         if(!$acl->isAllowed($role, $module)) 
          { 
           if('guest' == $role) 
            { 
              $request->setModuleName('auth'); 
              $request->setControllerName('login'); 
              $request->setActionName('index'); 
            } 
            else 
             { 
              $request->setModuleName('error'); 
              $request->setControllerName('error'); 
              $request->setActionName('notauthorized');          } 
            }  

    } 
} 

這裏我的代碼導航

public function _initNavigation() 
{ 
    $this->acl = Zend_Registry::get('acl'); 
    $this->bootstrap('layout'); 
    $this->role = Zend_Auth::getInstance()->getStorage()->read(); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 
    $navConfig = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
    $navigation= new Zend_Navigation($navConfig); 
    $view->navigation($navigation)->setAcl($this->acl)->setRole($this->role['Role']); 
} 

問題在這一點上是註冊表中沒有發現ACL;加載它不知道角色等導航因此,當.. 。

<?php 

類Plugins_acl延伸Zend_Controller_Plugin_Abstract {

//NOME DOS RESOURCES 
//private $modules = array(); 
//private $perfils = array(); 

public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
      $acl =new Zend_Acl();  
      //create the user roles 
      //1-ADMINISTRADOR 
      //2-MEDICO 
      //3- ASSISTENTE 
      //4- SECREATRIA 
      $acl->addRole(new Zend_Acl_Role('administrador')); 
      $acl->addRole(new Zend_Acl_Role('medico')); 
      $acl->addRole(new Zend_Acl_Role('assistente')); 
      $acl->addRole(new Zend_Acl_Role('secretaria')); 
      $acl->addRole(new Zend_Acl_Role('guest')); 


      //create the resources 
      $acl->addResource(new Zend_Acl_Resource('index')); 
      $acl->addResource(new Zend_Acl_Resource('error')); 
      $acl->addResource(new Zend_Acl_Resource('dashboard')); 
      $acl->addResource(new Zend_Acl_Resource('login')); 
      $acl->addResource(new Zend_Acl_Resource('default')); 

      $acl->allow(null,'index','index'); 
      $acl->allow('secretaria','dashboard'); 
      $acl->allow('secretaria','index'); 
      $acl->allow('secretaria','default'); 
      $acl->allow('guest','login'); 

      Zend_Registry::set('Zend_Acl', $acl); 

      $auth = Zend_Auth::getInstance(); 
      $roleUser = Zend_Auth::getInstance()->getStorage()->read(); 

      Zend_Registry::set('Zend_Acl_Role', $roleUser['Role']); 
      if($auth->hasIdentity()) 
       { 
        $identity = $auth->getIdentity($roleUser['Role']); 
        $role = strtolower($identity['Role']); 
       } 
       else 
        { 
         $role = 'guest'; 
       } 

        $controller = $request->controller; 
        $action = $request->action; 
        $module= $request->module; 

        if(!$acl->isAllowed($role, $module)) 
         { 
          if('guest' == $role) 
           { 
             $request->setModuleName('auth'); 
             $request->setControllerName('login'); 
             $request->setActionName('index'); 
           } 
           else 
            { 
             $request->setModuleName('error'); 
             $request->setControllerName('error'); 
             $request->setActionName('notauthorized');          } 
           }  
    /* 
    $this->modules = $aclNs->resources['modules']; 
    $this->perfils = $aclNs->resources['perfils']; 
    $this->modules[]= 'default'; 
    $this->modules[]= 'logout'; 
    $this->modules[]= 'login'; 
    $this->modules[]= 'error'; 
    $this->modules[]= 'index'; 
    $this->modules[]= 'gerenciar'; 
    */ 
} 

}

回答

0

你設置你必須將它保存在註冊表中,這樣就可以在佈局/視圖中使用它的ACL後:

... 
$acl->allow('guest','login'); 

Zend_Registry::set('Zend_Acl', $acl); 

... 
else 
{ 
    $role = 'guest'; 
} 
Zend_Registry::set('Zend_Acl_Role', $role); 

編輯:

我想我錯過其中使用導航佈局/視圖文件:

// set acl, role 
$this->navigation()->setAcl(Zend_Registry::get('Zend_Acl')); 
$this->navigation()->setRole(Zend_Registry::get('Zend_Acl_Role')); 

// your renderMenu call 
<?php echo $this->navigation()->menu()->renderMenu() ?> 

在引導唯一的:

$this->bootstrap('layout');  
$layout = $this->getResource('layout'); 
$view = $layout->getView(); 
$navConfig = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
$navigation = new Zend_Navigation($navConfig); 
$view->navigation($navigation); 
+0

我認爲錯誤是從當我建立了Zend導航地方找不到的作用「secretaria」未來 ?我怎樣才能爲ACL中的註冊表在引導水平,所以我可以通過到zend導航。 順便說一句,我仍然得到相同的錯誤。 – user1960170

+0

我也遇到這種情況:致命錯誤:未捕獲的異常'Zend_Exception'帶有消息'沒有條目註冊的密鑰'Zend_Acl'When我打電話到_initNavigation() – user1960170

+0

@ user1960170請更新您的問題併發布'_initNavigation' – bitWorking

0

當我在佈局中加入它後,它工作正常。

$this->navigation()->setAcl(Zend_Registry::get('Zend_Acl')); 
$this->navigation()->setRole(Zend_Registry::get('Zend_Acl_Role'));