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 ..(!)
答案 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字符串。