在提交和验证之间处理表单

时间:2013-08-11 15:35:49

标签: php symfony

现在使用Symfony2,我在当前的开发中遇到了一个问题:我需要编辑表单之前发送的数据进行验证。情况如下:

  • 我的表单包含两个重要字段:“name”和“domain”。
  • “domain”是指一个实体,其属性为“domain_name”。

现在,假设“name”设置为“mywebsite”(使用表单),并且域设置为“mydomain.com”(实体字段选择数据库中的域):

  • 表格[姓名]:“mywebsite”
  • form [domain]:Object(domain_name =>“mydomain.com”)

我想要实现的是根据所选域更改“名称”字段的值。我想将“domain_name”附加到“name”,以获得:

  • 表格[name]:“mywebsite.mydomain.com”
  • form [domain]:Object(domain_name =>“mydomain.com”)

我找到了2个解决方案,但它们似乎不适合这种情况:

  • 数据变换器。似乎只在一个字段上工作,但是,为了编辑“名称”,我需要从表单中访问“域”实体,这在Data Transformer类中是不可用的。我可能正在寻找的是一种在整个表单上应用数据转换器的方法(但我找不到这样做的方法......)
  • 表格活动。这将在提交之前编辑“名称”字段,但我希望我的修改发生在这之后(这样,用户无法改变它们)。

我错过了解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以修改form.PRE_BIND事件中提交的数据。发生此事件然后您在控制器中调用$form->bind($request)。如何将event subscriber添加到表单中。请记住,您必须处理未转换为实体等的裸数据。

将Data Transformer应用于整个表单非常简单 - 只是不要指定字段。例如

$builder
    ->add('name', 'text')
    ->add('domain', 'entity')
    ->addModelTransformer($transformer);

VS

// add a normal text field, but add your transformer to it
$builder->add(
    $builder->create('name', 'text')
        ->addModelTransformer($transformer)
);