我正在关注“how to” ' 在 Symfony 2 中实现注册表单 我创建了 Registration 和 RegistrationType,就像教程一样。
我还创建了 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 '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8eebe3efe7e2ceebe3efe7e2a0ede1e3" rel="noreferrer noopener nofollow">[email protected]</a>' (length=15)
'password' => string 'password' (length=8)
为什么表单与实体不“匹配”?
在我的 UserType 表单中,我配置了 data_class:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'My\Bundle\Entity\User',
));
}
用户类型:
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';
}
}
注册类型:
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;
}
}
最佳答案
在 Symfony 2.6 之前,此方法是 setDefaultOptions()
,而不是 configureOptions()
。因此,解决方案是升级到 Symfony 2.6/2.7 或阅读适合您版本的文档。
关于php - Symfony2 表单,与实体不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30580180/