我有一个具有getRoles方法的User实体。但是,为了使这项工作,getRoles()需要返回一个数组,如:
class User implements UserInterface {
...
public function getRoles()
{
return array($this->roles);
}
...
}
当我尝试创建表单来创建新用户时,问题出现了。这是因为每个用户应该只有一个角色,因此,我创建了一个这样的字段:
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
...
->add('roles', ChoiceType::class, array(
'choices' => array(
'Role 1' => 'ROLE_ONE',
'Role 2' => 'ROLE_TWO',
'Role 3' => 'ROLE_THREE',
'Role 4' => 'ROLE_FOUR'
),
'label' => 'Role')
)
...
但是当我尝试渲染它时,它会抛出错误:“注意:数组到字符串转换”,这是因为使用ChoiceType,我只能选择一个选项。使用选项
修复了此问题'multiple' => true
但是这允许选择多个选项(它不是我想要的)。
我尝试只返回角色,而不是数组:
class User implements UserInterface {
...
public function getRoles()
{
return $this->roles;
}
...
}
有了这个,表单现在可以正常工作,但是登录停止工作并告诉我下一个:
捕获致命错误:传递给Symfony \ Component \ Security \ Core \ Authentication \ Token \ UsernamePasswordToken :: __ construct()的参数4必须是数组类型,给定字符串......
我的应用程序的逻辑是用户只有一个角色,我不需要一个数组,但我不知道如何告诉symfony(在登录时)“角色”只是一个( string)不多(数组)......
抱歉我的英文。
答案 0 :(得分:0)
我的应用程序的逻辑是用户只有一个角色
UserInterface
需要一系列角色,因此,如果您希望用户只能拥有其中一个角色,则应在模型中反映该逻辑。
class User implements UserInterface
{
protected $role;
// ...
public setRole($role)
{
if (!is_string($role)) {
throw new \InvalidArgumentException('Invalid role');
}
$this->role = $role;
}
public function getRoles()
{
return array($this->role);
}
// ...
}
然后是
->add('role', ChoiceType::class, array(
'choices' => array(
'Role 1' => 'ROLE_ONE',
'Role 2' => 'ROLE_TWO',
'Role 3' => 'ROLE_THREE',
'Role 4' => 'ROLE_FOUR'
),
'label' => 'Role'
))
非常好,因为setRole
需要一个字符串,而getRoles
只是换行并返回该接口所需的那个值的数组。