gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:26:13 25 4
gpt4 key购买 nike

我对与非映射表单字段(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(...)
  • ...但是在 PRE_SET_DATA event 中添加了 hidden2 .

显然这两个字段是相同的(隐藏且未映射)并且类似于 symfony documentation说:

the data of an unmapped field can be accessed in a controller with:

$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:

在不同的 Controller 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()) 绑定(bind),它有效,为什么?

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 实体中,并且这是(我认为)访问我的底层实体的独特方式。

最佳答案

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

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

关于validation - 在 pre_set_data 中添加的 Symfony2 非映射字段不存在于表单的子集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30104658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com