Symfony表单:如何替换表单类/检索所有额外数据?

时间:2015-07-08 09:42:00

标签: php json forms rest symfony

Symfony 2表单组件确实是一种东西。我想你知道的。试图理解什么是有效的只是一个看似不可能的任务;我在浏览代码库时非常有经验..但是man,Form组件.. OMG

TL; DR

以下是详细信息,此问题试图询问

  • 是否可以替换班级\Symfony\Component\Form\Form
  • 或者:如何轻松地从表单类型的所有字段中获取所有额外数据?
  • 或者,一个相关的问题:如果我做$form->add('ss', 'form'),它究竟是如何工作的 - 显然Core\FormType类会涉及但是当我稍后检索它时,它是{{1 }}?这可能发生在哪里,这可能会覆盖,所以它在那里使用不同的类?

详情

情况

想象一个接收n深JSON有效负载的Controller。此有效负载通过Form进行解码和验证。现在,大多数JSON结构都由Models(Doctrine ODM Entities)映射。但是一些子属性只是“哈希” - 客户可以在那里发布任何他想要的东西 那些“哈希”子属性是类型形式的字段,是复合标记的,可以有额外的字段。

问题

我们的问题是,\Symfony\Component\Form\Form并未返回所有“额外字段”。我们无法指定那些字段(及其类型),因为我们不知道会发生什么 - 因此所有这些数据都是extraData的一部分。

解决方案?

所以我想 - 好吧 - 让我们修改FormFactory,这样它就会返回我们的Form的自定义扩展 - 一个在调用getData时也返回extraData的扩展。容易对。 Noo,不容易..

我的想法让我检查FormFactory,FormBuilders,ResolvedFormTypes,以及所有重要的地方(如$form->getData()) - 我想要覆盖/替换的类是instanciated static - 没有使用DIC ..(!)

1 个答案:

答案 0 :(得分:0)

我已经读过某个地方,Symfony 2中的Form组件是由魔鬼自己写的,让我们开发人员发疯了。幸运的是,我不那么疯狂,试图通过自己更换整个表单组件;)

除了笑话,当您定义表单时(通过创建<entity>Type类,如UserType),您定义的新类型可以像单个文本输入一样简单,也可以像完整一样复杂 - 成熟的表格(我们之前的UserType)。 “真实”表单(Symfony\Component\Form\Form)是根据您的类型定义创建的:

return $this->container->get('form.factory')->create(
    new UserType(), new User(), $options
);

您是否评估过为“extraData”创建自定义表单类型的想法?或者它可以映射为在提交之前由客户端JavaScript创建的JSON字符串。