php - Symfony2 表单,与实体不匹配

标签 php forms symfony

我正在关注“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/

相关文章:

php - 跨不同子域(但不是全部)进行身份验证

php - 计算图像大小比率以调整大小

Symfony:属性不存在 - 500 内部服务器错误 - ReflectionException

routing - 找不到 Symfony 3 路由

php - 通过添加后缀重命名文件

javascript - 为什么我的 object.children 未定义?

Javascript 文件困惑,我需要帮助修复它

forms - Redux 表单中的 DatePicker

php - 交响服务

使用 Mockery 进行 PHP 单元测试和模拟