Sonata + FOSUserBundle 在编辑表单上编辑角色
Sonata + FOSUserBundle edit roles on edit form
我正在使用 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()
;
}
FOSUserBundle 支持每个用户拥有多个角色,这确实很好。然而,根据我的经验,一个常见的用例是每个用户一个角色。
一个简单的管理方法是将以下方法添加到您的 model/entity 对象以获得单个角色:
public function getRole() {
$role = $this->roles[0];
return $role;
}
注意:$role = $this->roles[0]
将 return 数据库角色字段中的第一个 ROLE。可能需要根据自己的逻辑选择正确的角色。或者,也可能是您需要获得默认角色。如果您使用 $this->getRoles()
而不是 $this->roles
,您将拥有数据库角色以及 returned 数组中的默认角色。
接下来您需要添加匹配的 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'
不是 'roles'
如果您将创建完全相同的标签,作为角色 - 代码将工作得很好。像
->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
我正在使用 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()
;
}
FOSUserBundle 支持每个用户拥有多个角色,这确实很好。然而,根据我的经验,一个常见的用例是每个用户一个角色。
一个简单的管理方法是将以下方法添加到您的 model/entity 对象以获得单个角色:
public function getRole() {
$role = $this->roles[0];
return $role;
}
注意:$role = $this->roles[0]
将 return 数据库角色字段中的第一个 ROLE。可能需要根据自己的逻辑选择正确的角色。或者,也可能是您需要获得默认角色。如果您使用 $this->getRoles()
而不是 $this->roles
,您将拥有数据库角色以及 returned 数组中的默认角色。
接下来您需要添加匹配的 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'
不是 'roles'
如果您将创建完全相同的标签,作为角色 - 代码将工作得很好。像
->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