【问题标题】:Symfony Form: How to replace form class / retrieve all extra data?Symfony Form:如何替换表单类/检索所有额外数据?
【发布时间】:2015-09-26 03:25:30
【问题描述】:

Symfony 2 表单组件真的很重要。我想你知道这一点。试图了解什么是有效的,这似乎是一项不可能完成的任务;而且我在浏览代码库方面很有经验。但是,伙计,表单组件.. OMG

TL;DR

以下是详细内容,本期试问

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

详情

情况

想象一个控制器接收一个深度 JSON 负载。此有效负载通过 Form 进行解码和验证。现在,这个 JSON 结构的大部分都由模型(Doctrine ODM 实体)映射。但是一些子属性只是“哈希” - 允许客户在那里发布他想要的任何内容。
那些“散列”子属性是表单类型的字段,带有复合标记并且可以有额外的字段。

问题

我们的问题是,$form->getData() 没有返回所有“额外字段”。我们无法指定这些字段(及其类型),因为我们不知道会发生什么 - 所以所有这些数据都是 extraData 的一部分。

解决方案?

所以我想 - 好的 - 让我们修改 FormFactory,让它返回我们的自定义扩展 Form - 当 getData 被调用时它也返回 extraData。容易吧。?不,不容易..

我的想法是让我检查 FormFactory、FormBuilders、ResolvedFormTypes、whatnot.. 以及所有重要的地方(如 formBuilder->getForm()) - 我要覆盖/替换的类是实例化的静态类 - 不使用 DIC.. (!)

【问题讨论】:

    标签: php json forms rest symfony


    【解决方案1】:

    我在某处读到过,Symfony 2 中的表单组件是魔鬼自己编写的,目的是让我们开发人员发疯。幸运的是,我并没有那么疯狂地尝试自己替换整个表单组件;)

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

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

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

    【讨论】:

    • 这确实是正确的方法。虽然我在问这个问题后想通了。所以要学习:如果想从 JSON 有效负载中存储大的灵活结构,应该定义一个扩展 `Symfony\Component\Form\AbstractType` 的 FormType(如class FreeForm extends AbstractType) - 然后让getParent() 返回text,你基本上可以存储在你想要的东西里面。
    猜你喜欢
    • 2014-07-07
    • 2017-08-18
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 2023-04-01
    相关资源
    最近更新 更多