[英]Users with only one role in Symfony
我有一個 User 實體,它有它的 getRoles 方法。 但是,要完成這項工作,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,我只能 select 一個選項。 此問題已通過以下選項解決:
'multiple' => true
但這允許 select 不止一個選項(這不是我想要的)。
我嘗試只返回角色,而不是數組:
class User implements UserInterface {
...
public function getRoles()
{
return $this->roles;
}
...
}
有了這個,表單現在可以工作了,但是登錄停止工作並告訴我下一個:
可捕獲的致命錯誤:傳遞給 Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() 的參數 4 必須是數組類型,給定的字符串...
我的應用程序的邏輯是用戶只有一個角色,我不需要數組,但我不知道如何告訴 symfony(登錄時)“角色”只是一個(字符串)不是更多(數組)...
對不起我的英語不好。
我的應用程序的邏輯是用戶只有一個角色
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
只是包裝並根據接口需要返回該值的數組。
我解決了這個問題:
使用 'mapped' => false 取消映射實體字段角色:
->add('roles', ChoiceType::class, [
'choices' => [
'Admin' => 'ROLE_ADMIN',
'User' => 'ROLE_USER',
],
'mapped' => false,
'label' => 'Role'
]);
然后,在 controller 上,使用表單中的數據設置用戶角色:
$user = new User();
$user->setRoles([$form->get('roles')->getData()]);
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.