我对与非映射表单字段相关的问题感到困惑(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
实体内,这是(我认为)独特的方式访问我的基础实体。
答案 0 :(得分:3)
将数据传递给表单时,将调用PRE_SET_DATA事件(createForm()的第二个参数)。传递NULL时,不会调用此事件。
此事件的目的是根据传递的数据更改表单字段,因此在表单中没有默认数据的情况下使用它是没有意义的。