2015-06-01 5 views
2

Я следую за регистрационной формой «how to» в Symfony 2 Я создал регистрационный и регистрационный тип, как и учебник.Форма Symfony2, не соответствует объекту

Я также создал объект User и UserType. Все равно, но я получил Исключение, представляющее форму.

Catchable Fatal Error: Argument 1 passed to My\Bundle\Form\Model\Registration::setUser() must be an instance of My\Bundle\Entity\User, array given 

в еще потому Registration.php:

public function setUser(User $user) 
{ 
    $this->user = $user; 
} 

$user не User, является array. Этот массив имеет данные входы:

array (size=2) 
'email' => string '[email protected]' (length=15) 
'password' => string 'password' (length=8) 

Почему форма не является «соответствие» сущность?

В моей форме UserType я настроил data_class:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class'  => 'My\Bundle\Entity\User', 
    )); 
} 

UserType:

class UserType extends AbstractType 
{ 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('email', 'text') 
     ->add('password', 'repeated', array(
      'first_name' => 'password', 
      'second_name' => 'confirm', 
      'type'   => 'password' 
     )) 
     ; 
} 

/** 
* @param OptionsResolver $resolver 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class'  => 'My\Bundle\Entity\User', 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'user'; 
} 
} 

RegistrationType:

class RegistrationType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('user', new UserType()); 
    $builder->add('terms', 'checkbox', array('property_path' => 'termsAccepted')); 
    $builder->add('Register', 'submit'); 
} 

public function getName() 
{ 
    return 'registration'; 
} 
} 

Регистрация:

class Registration { 

/** 
* @Assert\Type(type="My\Bundle\Entity\User") 
* @Assert\Valid() 
*/ 
protected $user; 

/** 
* @Assert\NotBlank() 
* @Assert\True() 
*/ 
protected $termsAccepted; 



public function setUser(User $user) 
{ 
    $this->user = $user; 
} 

public function getUser() 
{ 
    return $this->user; 
} 

public function getTermsAccepted() 
{ 
    return $this->termsAccepted; 
} 

public function setTermsAccepted($termsAccepted) 
{ 
    $this->termsAccepted = (bool) $termsAccepted; 
} 
} 

Действие: сущность

public function registerProcessAction(Request $request){ 

    $em = $this->getDoctrine()->getManager(); 

    $form = $this->createForm(new RegistrationType(), new Registration()); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $registration = $form->getData(); 
     $em->persist($registration->getUser()); 
     $em->flush(); 

     return $this->redirectToRoute(...); 
    } 
    else{ 
     die('invalid'); 
    } 

Пользователь:

/** 
* Class User 
* @ORM\Entity 
* @UniqueEntity(fields="email", message="Email already taken") 
*/ 
class User{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 


/** 
* @ORM\Column(type="string", length=150, unique=true) 
* @Assert\NotNull() 
* @Assert\Email() 
*/ 
private $email; 

/** 
* @ORM\Column(type="string", length=255) 
* @Assert\NotBlank() 
* @Assert\Length(max = 4096) 
*/ 
private $password; 

/** GETTERS **/ 
public function getId() 
{ 
    return $this->id; 
} 

public function getEmail() 
{ 
    return $this->email; 
} 

public function getPassword() 
{ 
    return $this->password; 
} 

/** SETTERS **/ 

public function setEmail($email) 
{ 
    $this->email = $email; 

    return $this; 
} 

public function setPassword($password) 
{ 
    $this->password = password_hash($password, PASSWORD_DEFAULT); 

    return $this; 
} 

} 
+0

Вы сказали это - это не соответствует, потому что это массив, и метод ожидает объект 'User'. Что содержит переменная '$ user'? Можете ли вы отредактировать свой пост и показать, как вы его заполняете? – Artamiel

+0

@Artamiel, я обновил вопрос, добавив переменную 'var_dump' переменной' $ user'. Я не заполняю эту переменную, я полагаю, что это код Symfony Form. Спасибо –

+0

PLS показать содержание вашего действия, где вы связываете пользователя с формой –

ответ

2

До Symfony 2.6 этот метод был setDefaultOptions(), не configureOptions(). Таким образом, решение было бы перейти на Symfony 2.6/2.7 или прочитать документацию для вашей версии.

Смежные вопросы