Forms 如何在Symfony2中的某些步骤中创建表单-步骤验证

Forms 如何在Symfony2中的某些步骤中创建表单-步骤验证,forms,validation,symfony,symfony-2.3,Forms,Validation,Symfony,Symfony 2.3,我希望在Symfony2(确切地说是2.3)中的某些步骤中执行表单,但当我尝试执行此操作时,表单中会出现错误 我已经做了下一步: 1) 我已经创建了一个类 class MyClass { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string *

我希望在Symfony2(确切地说是2.3)中的某些步骤中执行表单,但当我尝试执行此操作时,表单中会出现错误

我已经做了下一步:

1) 我已经创建了一个类

class MyClass
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Assert\NotNull()
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="surname", type="string", length=255)
 * @Assert\NotNull()
 */
private $surname;
}
2) 我已经创建了FormType类:

class MyClassType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', null, array('label' => 'name'))
        ->add('surname', null, array('label' => 'surname'));     
}
我还创建了另外两个类来分隔获取表单数据的过程:

class MyClass1Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', null, array('label' => 'name'));     
}

class MyClass2Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('surname', null, array('label' => 'surname'));     
}
在控制器中,我有一些方法:

public function new1Action()
{
    $entity = new MyClass();
    $form   = $this->createForm( new MyClass1Type( $entity );

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}

public function new2Action(Request $request)
{
    $entity  = new MyClass();
    $formMyClass1 = $this->createForm(new MyClass1Type($entity) );
    $formMyClass1->bind($request);

    if (!$formMyClass1->isValid()) {
        print_r($formMyClass1->getErrors());
        return new Response("Error");
    }

    $form   = $this->createForm( new MyClass2Type($entity) );

    return array(
        'entity' => $entity,
        'form'   => $form->createView(),
    );
}
我呈现了第一个表单(new1Action),它完美地获得了数据,但问题是当我提交数据时。在new2Action中,应用程序将抛出响应(“错误”)代码,因为表单无效。print_r()函数显示下一个信息:

Array ( [0] => Symfony\Component\Form\FormError Object ( [message:Symfony\Component\Form\FormError:private] => Este valor no debería ser null. [messageTemplate:protected] => This value should not be null. [messageParameters:protected] => Array ( ) [messagePluralization:protected] => ) ) 
我认为问题在于类没有完成第一个表单中的数据,但是我需要将表单分为两步,我不知道如何处理这个错误

有人能帮我吗


提前谢谢

将您的实体与MyClassType绑定后,您的实体具有有效名称,但没有姓氏
$myFormClass1->isValid()
返回false,因为它尝试验证实体,而您没有指定验证部分数据,所以它不喜欢姓氏为null

您应该使用验证组在部分数据上验证您的实体。登记Symfony book

在表格中添加:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => array('validationStep1'),
    ));
}
并使用
@Assert\NotNull(groups={“validationStep1”})
在实体的@Assert注释上定义验证组:


非常感谢你!!我从未读过这方面的文章,但它完全解决了我的问题。你有+1和记号。问候!!太好了,这就是我要找的,但我还是有些怀疑。首先,在MyClass2Type中,您必须再次包含字段名,因为如果没有,则new3Action(将MyClass2Type与整个实体绑定)不会绑定实体中的name字段,因为MyClass2Type中没有任何name字段。此外,如果将name字段设置为read_only属性,则可以通过html进行更改,因此不安全:(是的,您的name属性是正确的,但是如果您将其添加到new3Action,您应该确保用户不能更改它。我处理的方法是在每个步骤之间的会话中保存实体。首先屏幕显示MyClassType,然后将其绑定到实体,将其保存到会话并显示MyClass2Type。请确保从t获取实体当你创建表单时,他会创建一个会话。在这种情况下,你不需要在每个类型中定义所有字段。
/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Assert\NotNull(groups={"validationStep1"})
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="surname", type="string", length=255)
 */
private $surname;