簡體   English   中英

在 Symfony 中只有一個角色的用戶

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM