使用Symfony2一段时间后,我在当前的开发中遇到了一个问题:在验证表单之前,我需要编辑表单发送的数据。情况如下:
- 我的表单包含两个重要字段:"名称"answers"域"
- "域"是指具有属性"domain_name"的实体
现在,假设"name"设置为"mywebsite"(使用表单),域设置为"mydomain.com"(在数据库中选择域的实体字段):
- 表单[名称]:"我的网站"
- form[domain]:对象(domain_name=>"mydomain.com")
我想要实现的是根据所选域更改"名称"字段的值。我想在"name"后面加上"domain_name",以便获得:
- 表单[名称]:"mywebsite.mydomain.com"
- form[domain]:对象(domain_name=>"mydomain.com")
我找到了两种解决方案,但它们似乎不适合这种情况:
- 数据转换器。似乎只处理一个字段,然而,为了编辑"名称",我需要从表单中访问"域"实体,这在Data Transformer类中不可用。我可能正在寻找一种在整个表单上应用数据转换器的方法(但我没有找到这样做的方法…)
- 表单事件。这将在提交之前编辑"名称"字段,但我希望在提交之后进行修改(这样,用户就无法更改它们)
有没有我错过的解决方案?
您可以在form.PRE_BIND
事件中修改提交的数据。当您调用控制器中的$form->bind($request)
时,就会发生此事件。如何将事件订阅者添加到表单中。请记住,您必须处理未转换为实体等的裸数据。
将DataTransformer应用于整个表单非常简单——只是不要指定字段。例如
$builder
->add('name', 'text')
->add('domain', 'entity')
->addModelTransformer($transformer);
与
// add a normal text field, but add your transformer to it
$builder->add(
$builder->create('name', 'text')
->addModelTransformer($transformer)
);