使用userManager的addRole不起作用

时间:2014-07-16 01:56:00

标签: php symfony fosuserbundle symfony-2.4

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

$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:{}并且找不到错误之外,所有工作都很好,可以给我一些建议吗?

3 个答案:

答案 0 :(得分:1)

如果你的剩余部分有效,那么你的代码行

 $user->addRole("ROLE_USER");

应该是

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

因为在您的User类(FOS \ UserBundle \ Model \ User)

    public function setRoles(array $roles)
    {
      $this->roles = array();

      foreach ($roles as $role) {
        $this->addRole($role);
        }

       return $this;
      }

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

答案 1 :(得分:1)

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

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

问题在于......

FOS \ UserBundle \模型\的UserInterface

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

FOS \ UserBundle \模型\用户

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方法中的角色。 / p>

答案 2 :(得分:0)

如果您创建这样的表单:

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

因为角色只是一个数组