【发布时间】:2015-07-18 05:42:44
【问题描述】:
我对与非映射表单字段 (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被添加到PRE_SET_DATA event 中。
显然这两个字段是相同的(隐藏和未映射),就像symfony documentation 所说:
可以在控制器中访问未映射字段的数据:
$form->get('unmapped-field')->getData();
嗯……
现在,在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!">
案例 1:
在另一个控制器controllerTwo 我想验证这个表单。我再次创建表单,但这次我没有传递任何实体(第二个空参数):
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...
}
所以...尝试在$form 中获取hidden2 会引发异常(在...Component/Form/Form.php 中的第964 行),因为hidden2 不存在于表单的子项中。
案例 2:
但是,将表单与一个空的 Product 对象 (new Product()) 绑定,它可以工作,为什么?
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
}
为什么在案例 1 中 hidden1 是表单的孩子,而 hidden2 不是?
注意:我需要在pre_set_data 中添加hidden2,因为该值在我的Product 实体中,这是(我认为)访问我的基础实体的唯一方式。
【问题讨论】:
标签: validation symfony symfony-forms