2016-04-11 45 views
0

sadece bir rolü olan kullanıcılar getRoles yöntemine sahip bir Kullanıcı var. Ben yeni kullanıcılar oluşturmak için bir form yapmaya çalıştığınızda sorun gelirSymfony

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

: Ama, bu işi almak için, getRoles() gibi bir şey bir dizi dönmek gerekir.

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

Ama bunu işlemek çalıştığınızda, bana hata atıyor: Bu Böyle bir alan oluşturmak, her kullanıcının yalnızca bir role sahip olmalıdır çünkü, bu yüzden "Uyarı: string dönüşüm Array", ve bunun nedeni ChoiceType ile bir seçenek seçebiliyorum.

'multiple' => true 

Ama bu (bunun bana göre neyin olmadığını) birden fazla seçenek seçmenize olanak sağlar: Bu sorun seçeneği ile sabittir.

Sadece rol dönmek için denemek değil, bir dizi: Bununla

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

, form artık çalışır, ancak giriş çalışmamaya başlıyor ve bana ertesi anlatır:

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

Uygulamamın mantığı, kullanıcının tek bir role sahip olması, bir diziye ihtiyacım yok, ama bende (oturum açmada) "rollerin" sadece bir (string) olduğunu söyleyemem. (dizi) ...

Benim ingilizce için özür dilerim.

cevap

0

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

UserInterfaceEğer kullanıcıların yalnızca bunlardan biri olabileceğini istiyorum nedenle eğer rolleri bir dizi gerektirir, modeliniz bu mantık yansıtmalıdır. setRole bir dize bekliyor ve getRoles sadece sarın ve arayüz istediği gibi bu değerin dizisi dönmek beri

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

    // ... 
} 

sonra

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

, gayet olumlu.

+0

Teşekkür ederiz! ancak ChoiceType hala bana hatayı veriyor: '" Uyarı: Dizgeyi dizge dönüştürme "'. Sorun şu ki, getRoles() bir dizi döndürür ... – WeirdestBoy

+0

'-' ('role', 'değil,' -> add ('roles', ' – Federkun

+0

'' (aksi takdirde bir [Data Transformer]) kullanabilirsiniz. http://symfony.com/doc/current/cookbook/form/data_transformers.html) – Federkun