2016-04-11 55 views
0

我有一個擁有getRoles方法的用戶實體。但是,要得到這個工作,getRoles()必須返回一個數組,像這樣:在Symfony中只有一個角色的用戶

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; 
    } 
    ... 
} 

這樣,形式現在的工作,但在登錄停止工作,並告訴我下:

Catchable Fatal Error: Argument 4 passed to Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() must be of the type array, string given...

的我的應用程序的邏輯是用戶只有一個角色,我不需要數組,但我不知道如何告訴symfony(在登錄時)「角色」只是一個(字符串)而不是更多(陣列)...

對不起,我的英語。

回答

0

The logical of my application is that the user has just one role

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只是包裝,並返回作爲接口希望該值的陣列。

+0

謝謝!但ChoiceType仍然給我錯誤:'「注意:數組到字符串轉換」'。問題是,getRoles()返回數組... – WeirdestBoy

+0

你應該映射' - > add('role',',not' - > add('roles',' – Federkun

+0

否則你可以使用[Data transformer]( http://symfony.com/doc/current/cookbook/form/data_transformers.html) – Federkun

相關問題