2016-04-11 9 views
0

私は、getRolesメソッドを持つUserエンティティを持っています。私は、新しいユーザーを作成するためのフォームを作成しようとすると、問題が来るsymfonyで1つの役割しか持たないユーザ

class User implements UserInterface { 
    ... 
    public function getRoles() 
    { 
     return array($this->roles); 
    } 
    ... 
} 

:しかし、この作業を取得するには、getRoles()、のようなものを配列を返す必要があります。これは、各ユーザーが一つだけな役割を持っているはずだからですので、私はこのようなフィールドを作成します。

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を使用すると、1つのオプションしか選択できないためです。

'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' 
)) 

インターフェースが望んでいるとしてだけでその値の配列をラップして返すgetRolessetRoleは、文字列を期待するので、まったく問題あり、と。

+0

ありがとうございました! ChoiceTypeはまだ私にエラーを通知します: '' Notice:配列から文字列への変換 ''。問題は、getRoles()が配列を返すということです... – WeirdestBoy

+0

' - > add( 'role'、' not、 ' - > add( 'roles'、' – Federkun

+0

そうでなければ[データ変換] http://symfony.com/doc/current/cookbook/form/data_transformers.html) – Federkun

関連する問題