【问题标题】:addRole using userManager doesn't work使用 userManager 的 addRole 不起作用
【发布时间】:2014-07-16 01:55:59
【问题描述】:

我正在尝试在用户以这种方式注册时为其添加角色:

$em = $this->getDoctrine()->getManager();

$userManager = $this->container->get('fos_user.user_manager');
$user = $userManager->createUser();

$user_data = $request->get('user_profile');

$user->setUsername($user_data['rif']);
$user->setEmail($user_data['user']['email']);
$user->setPlainPassword($user_data['user']['password']);
$user->addRole("ROLE_USER");
$userManager->updateUser($user);

除了 DB 中的角色存储为 a:0:{} 并且我找不到错误之外,一切正常,有没有人可以给我一些建议?

【问题讨论】:

    标签: php symfony fosuserbundle symfony-2.4


    【解决方案1】:

    我认为您的问题是您正在尝试添加 ROLE_USER 角色。

    您是否尝试过添加其他角色?

    问题出在..

    FOS\UserBundle\Model\UserInterface

    const ROLE_DEFAULT = 'ROLE_USER';
    const ROLE_SUPER_ADMIN = 'ROLE_SUPER_ADMIN';
    

    FOS\UserBundle\Model\User

    public function addRole($role)
    {
        $role = strtoupper($role);
        if ($role === static::ROLE_DEFAULT) {
        // If supplied $role === ROLE_USER just return User object
            return $this;
        }
    
        if (!in_array($role, $this->roles, true)) {
            $this->roles[] = $role;
        }
    
        return $this;
    }
    
    ....
    
    /**
     * Returns the user roles
     *
     * @return array The roles
     */
    public function getRoles()
    {
        $roles = $this->roles;
    
        foreach ($this->getGroups() as $group) {
            $roles = array_merge($roles, $group->getRoles());
        }
    
        // we need to make sure to have at least one role
        $roles[] = static::ROLE_DEFAULT;
    
        return array_unique($roles);
    }
    

    如果您添加默认角色 (ROLE_USER),它实际上并没有添加到角色列表中,因为它默认添加到 getRoles 方法中的角色中。

    【讨论】:

      【解决方案2】:

      如果你剩下的东西有效,那么你的代码行

       $user->addRole("ROLE_USER");
      

      应该是

      $user->setRoles(array("ROLE_USER"));
      

      因为在你的用户类(FOS\UserBundle\Model\User)中

          public function setRoles(array $roles)
          {
            $this->roles = array();
      
            foreach ($roles as $role) {
              $this->addRole($role);
              }
      
             return $this;
            }
      

      定义了设置角色的方法,其值应为数组格式..

      【讨论】:

      • 如果您没有注意到,FOSUserBundle(以及您复制的代码)使用$this->addRole($role) 将角色添加到角色数组。使用数组设置角色将涉及每次您想要添加角色时都必须读取所有角色。
      • 是的,你是对的,如果你想获取刚刚输入的角色,那么在你的子包用户类中,这个方法应该被重写为“public function setRoles(array $roles) { $this- >roles = $roles; }"
      • 这是一个不必要的覆盖。通过将其更改为仅使用 setRoles 作为数组,这意味着要添加角色,您必须调用 $roles = $user->getRoles(); $roles[] = 'NEW_ROLE'; $user->setRoles($roles) 而不仅仅是 $user->addRole('NEW_ROLE')
      • 但如果它作为直接传递->setRoles($roles),那么它会给出错误“它应该与“FOS\UserBundle\Model\User”的setRoles(array $roles ) 方法”,因为这个子用户类(我的 Bundle 的用户类)扩展了“FOS\UserBundle\Model\User”类。以及更多,如果它通过 ->setRoles('ROLE_USER') 那么它会给出错误,如“预期的数组值,但它是字符串”..
      • 我知道setRoles() 需要适合父级,但没有必要覆盖它。 setRoles(array $roles) 可以正常工作,但也有 addRoles($role) 方法。这些方法都不需要被覆盖。在您的子模型版本中,您只是无缘无故地删除了addRole 部分。
      【解决方案3】:

      如果您像这样创建表单:

                  ->add('roles','collection', array(
                      'label'     => 'Rôle',
                      'type'      => 'choice',
                      'options'   => array(
                          'choices' => array(
                              'ROLE_USER'             => 'Client',
                              'ROLE_ADMIN'            => 'Admin',
                              'ROLE_SUPER_ADMIN'      => 'SuperAdmin',
                              'ROLE_TECHNICIEN'       => 'Technicien',
                              'ROLE_RESPONSABLE_PARC' => 'Responsable'
                          ),
                          'expanded'  => false,
                          'multiple' => false
                      )
                  ))
      

      改成这样:

          $builder->add('roles', 'choice', array(
                      'label'     => 'Rôles',
                      'choices' => array(
                          'ROLE_USER'             => 'Client',
                          'ROLE_ADMIN'            => 'Admin',
                          'ROLE_SUPER_ADMIN'      => 'SuperAdmin',
                          'ROLE_TECHNICIEN'       => 'Technicien ',
                          'ROLE_RESPONSABLE_PARC' => 'Responsable'
                      ),
                      'expanded'  => false,
                      'multiple' => true,
                  ))
      

      因为角色只是一个数组

      【讨论】:

        猜你喜欢
        • 2019-08-25
        • 2018-03-24
        • 2020-08-13
        • 2020-05-03
        • 1970-01-01
        • 2017-06-12
        • 2018-10-07
        • 2014-04-18
        • 1970-01-01
        相关资源
        最近更新 更多