Sonata + FOSUserBundle在编辑表单上编辑角色

时间:2015-02-26 09:02:32

标签: symfony fosuserbundle sonata-admin

我正在使用SonataAdminBundle进行用户管理。我想改变用户的角色。目前我在configureFormFields方法中的代码是这样的,但角色永远不会更新,我不知道为什么。

// Fields to be shown on create/edit forms
    protected function configureFormFields(FormMapper $formMapper)
    {

        $formMapper
            ->with('General')
                ->add('roles', 'choice', array(
                    'choices' => array(
                        'ROLE_ADMIN' => 'ADMIN',
                        'ROLE_USER'  => 'API USER',
                    ),
                    'expanded' => false,
                    'multiple' => true,
                    'required' => false
                ))
                ->add('email')
                ->add('plainPassword', 'text', array('label' => 'Password', 'required' => false))
            ->end()
        ;
    }

2 个答案:

答案 0 :(得分:6)

FOSUserBundle支持每个用户拥有多个ROLES,这确实很好。然而,根据我的经验,一个常见的用例是每个用户一个角色。

管理此方法的一种简单方法是将以下方法添加到模型/实体对象以获取单个角色:

public function getRole() {
    $role = $this->roles[0];
    return $role;
}

注意:$role = $this->roles[0]将返回数据库角色字段中的第一个ROLE。您可能需要使用自己的逻辑选择正确的角色。或者,您可能还需要获得默认角色。如果使用$this->getRoles()而不是$this->roles,则您拥有数据库角色以及返回数组中的默认角色。

接下来,您需要添加匹配的setter,以便为每个用户保存单个角色。这个实现将起作用。

public function setRole($role) {
    $this->setRoles(array($role));
}

最后,您需要在用户表单中添加一个角色字段:

$builder->add('role', 'choice', array(
    'choices' => array(
        'ROLE_USER' => 'User',
        'ROLE_ADMIN' => 'Admin',
        'ROLE_SUPER_ADMIN' => 'Super Admin'
    ),
    'multiple' => false
));

需要注意的重要事项:

$builder->add('role'...'role' NOT 'roles'

答案 1 :(得分:0)

如果您将创建完全相同的标签,那么角色代码将非常有用。像

这样的东西
->add('roles', 'choice', array(
                'choices' => array(
                    'ROLE_ADMIN' => 'ROLE_ADMIN',
                    'ROLE_USER'  => 'ROLE_USER',
                ),
                'expanded' => false,
                'multiple' => true,
                'required' => false
            ))

供应商版本,已使用上面的代码进行测试

doctrine/doctrine-bundle 1.8.1
friendsofsymfony/user-bundle 2.1.2
doctrine/orm 2.6.1
sonata-project/admin-bundle 3.33.0
sonata-project/doctrine-orm-admin-bundle 3.4.2
symfony/symfony 3.4.6