在pre_set_data中添加的Symfony2非映射字段不存在于表单的子集合中

时间:2015-05-07 14:53:22

标签: validation symfony symfony-forms

我对与非映射表单字段相关的问题感到困惑(Symfony 2.6.6)。

我有一个基于Product实体的表单类:

class ProductType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('hidden1', 'hidden', array(
            'data' => 'Welcome hidden1!'
            'mapped' => false,
        ))
        ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('hidden2', 'hidden', array(
                'data' => 'Welcome hidden2!'
                'mapped' => false,
            ));
        }
    }

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

仔细观察......我添加了两个未映射的隐藏字段:

  • hidden1会直接添加到$builder->add(...)
  • ...但hidden2中添加了$form->get('unmapped-field')->getData();

显然两个字段都相同(隐藏和未映射),而PRE_SET_DATA event表示:

  

可以在控制器中访问未映射字段的数据:

     

controllerOne

嗯...

现在,在controllerTwo我创建表单并传递我的实体,将操作更改为public function controllerOneAction(Product $product, Request $request) { $form = $this->createForm(new productType(), $product, array( 'action' => $this->generateUrl('controller_two_route') )); return $form->createView(); }

{{ form(form) }}

好的,渲染表单(<input type="hidden" id="my_form_hidden1" name="my_form[hidden1]" value="Welcome hidden1!"> <input type="hidden" id="my_form_hidden2" name="my_form[hidden2]" value="Welcome hidden2!"> )我可以看到我的两个隐藏字段:

controllerTwo

案例1:

在另一个控制器public function controllerTwoAction(Request $request) { $form = $this->createForm(new productType(), null); echo $form->get('hidden1')->getData(); // prints 'Welcome hidden1' in screen echo $form->get('hidden2')->getData(); // throw an exception... } 中,我想验证此表单。我再次创建表单,但这次我没有传递任何实体(第二个空参数):

hidden2

因此......试图在$form中获取hidden2会引发异常(在第964行的... Component / Form / Form.php中),因为public function controllerTwoAction(Request $request) { $form = $this->createForm(new productType(), new Product()); echo $form->get('hidden1')->getData(); // prints 'Welcome hidden1' in screen echo $form->get('hidden2')->getData(); // prints 'Welcome hidden2' in screen } 不存在在形式的孩子。

案例2:

但是,将表单与空的Product对象(new Product())绑定,它有效,为什么?。

hidden1

为什么案例1 hidden2是儿童形式,但hidden2不是?

注意:我需要在pre_set_data中添加Product,因为该值位于我的td实体内,这是(我认为)独特的方式访问我的基础实体。

1 个答案:

答案 0 :(得分:3)

将数据传递给表单时,将调用PRE_SET_DATA事件(createForm()的第二个参数)。传递NULL时,不会调用此事件。

此事件的目的是根据传递的数据更改表单字段,因此在表单中没有默认数据的情况下使用它是没有意义的。