2017-05-19 2 views
0

Je souhaite ajouter plusieurs rôles pour un utilisateur. Cependant, je suis gettng l'erreur suivante:Zend Exception InvalidArgumentException non interceptée lors de l'ajout de plusieurs rôles pour un utilisateur

Fatal error: Uncaught Zend\View\Exception\InvalidArgumentException: $role must be a string, null, or an instance of Zend\Permissions\Role\RoleInterface; array given in C:\xampp\htdocs\newtt\vendor\zendframework\zend-view\src\Helper\Navigation\AbstractHelper.php:704. 

code:

public function getViewHelperConfig() 
{ 

    return array(
     'factories' => array(
      // This will overwrite the native navigation helper 
      'navigation' => function(HelperPluginManager $pm) { 
       $sm = $pm->getServiceLocator(); 
       $config = $sm->get('Config'); 
       $Adapter = $sm->get('Model\Adabter'); 
       $table = new \Models\Exnewtt\ExProfilfonctionnaliteTable($Adapter); 
       $acl = new \Navigation\Acl\Acl($config); 


       // Get the AuthenticationService 
       $auth = $sm->get('Zend\Authentication\AuthenticationService'); 
       $role = \Navigation\Acl\Acl::DEFAULT_ROLE; // The default role is login $acl 

       if ($auth->hasIdentity()) { 
        $user = $auth->getIdentity(); 
        $usrlId = $user->id_profil; 
        $authorization = $table->getProfilfonctionnalite2($usrlId); 
        $navigation = $pm->get('Zend\View\Helper\Navigation'); 
        $roles = array(); 
        $a = array(); 
        foreach ($authorization as $autho) : 
         // TODO we don't need that if the names of the roles are comming from the DB 
          $a[$autho->id_fonctionnalite]= $autho->id_fonctionnalite; 

         if($autho->id_fonctionnalite == 0) { 
          $role = \Navigation\Acl\Acl::DEFAULT_ROLE; // login 
          $roles[$autho->id_fonctionnalite] ='login'; 
         } 
         else if($autho->id_fonctionnalite == 1) { 
           $role = 'non'; 
           // Store ACL and role in the proxy helper: 
           $roles[$autho->id_fonctionnalite] ='non'; 
         } else if($autho->id_fonctionnalite == 2) { 
          $role = 'agent'; 
          $roles[$autho->id_fonctionnalite] ='agent'; 
         } else if($autho->id_fonctionnalite == 3) { 
          $role = 'admin' ; 

          $roles[$autho->id_fonctionnalite] ='admin'; 
          } 
         else if($autho->id_fonctionnalite == 4) { 
          $role = 'article' ; 
          $roles[$autho->id_fonctionnalite] = 'article'; 
         } 
         else if($autho->id_fonctionnalite == 5) { 
          $role = 'comptecomptable'; 
          $roles[$autho->id_fonctionnalite] ='comptecomptable'; 
         } else if($autho->id_fonctionnalite == 6) { 

          $roles[$autho->id_fonctionnalite] ='espacett'; 
          } 
          else if($autho->id_fonctionnalite == 7) { 
           $roles[$autho->id_fonctionnalite] = 'profil'; 
          } 
          else if($autho->id_fonctionnalite == 8) { 
            $role = 'remise'; 
           $roles[$autho->id_fonctionnalite] = 'remise'; 
          } 
         else if($autho->id_fonctionnalite == 9) { 
            $role = 'tracage'; 

          $roles[$autho->id_fonctionnalite] ='tracage'; 
         } 

          else if($autho->id_fonctionnalite == 10) { 
            $role = 'taxe'; 

           $roles[$autho->id_fonctionnalite] = 'taxe'; 
          } 
          else if($autho->id_fonctionnalite == 11) { 
           $role = 'utilisateur'; 


           $roles[$autho->id_fonctionnalite] ='utilisateur'; 

          } 
           else { 
            $role =\Navigation\Acl\Acl::DEFAULT_ROLE;; // login 
            $roles[$autho->id_fonctionnalite] = 'login'; 
           } 

         endforeach; 


        } 
        // Return the new navigation helper instance 
         $navigation->setAcl($acl)->setRole($roles); 

         return($navigation) ;  

       } 
      ) 
     ); 
    } 

Répondre

0

Vous ne pouvez pas avoir plus d'un rôle à la fois pour la navigation. Vous devriez obtenir une autorisation unique (pas une collection) et ensuite dans vos conditions if, vous devez les placer dans l'ordre des précédents descendants, de sorte qu'un utilisateur avec plusieurs rôles renvoie les plus permissifs en premier.

Si votre valeur $usrlId n'est pas unique, vous avez un problème de modélisation fondamental.

Exemple

// Note that the $table method name is altered to imply it doesn't return a collection. 
// You'll need to either make a new method, or pull it out of the collection here. 
$authorization = $table->getOneProfilfonctionnalite2($usrlId); 

if($authorization->id_fonctionnalite == 0) { 
    $role = \Navigation\Acl\Acl::DEFAULT_ROLE; // login 
    return $navigation->setAcl($acl)->setRole('login'); 
} else if($authorization->id_fonctionnalite == 1) { 
    $role = 'non'; 
    return $navigation->setAcl($acl)->setRole('non'); 
} else if($authorization->id_fonctionnalite == 2) { 
    // snip