为一个用户

时间:2017-05-19 12:38:57

标签: zend-framework2

我想为一个用户添加许多角色。但是,我得到以下错误:

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) ;    

                }
            )
        );
    }

1 个答案:

答案 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