使用userManager的addRole不起作用

问题描述 投票:0回答:3

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

$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
3个回答
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方法中的角色。


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

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


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

因为角色只是一个数组

© www.soinside.com 2019 - 2024. All rights reserved.