我想为一个用户添加许多角色。但是,我得到以下错误:
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.
代码:
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) ;
}
)
);
}
答案 0 :(得分:0)
您一次不能有多个角色进行导航。您应该获得一个唯一的授权(不是集合),然后在if条件中,您应该按照先例下降的顺序放置它们,这样具有多个角色的用户将首先返回最宽松的用户。
如果您的$usrlId
值不唯一,则会出现基本的建模问题。
实施例
// 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