Symfony 2形成一对多没有收集(只添加一个项目)

时间:2015-05-06 08:16:00

标签: php forms symfony collections

我正在构建一个与one-to-many实体具有User关系的简单表单:

User 1..* actions

基本上,在我的用户表单中,我必须将actions属性设置为collection表单类型。

我不希望客户端能够在表单中添加多个操作,但在编辑用户时只需要一个。

问题在于Symfony 2表单希望从submit上的表单中获取所有操作,因此现有操作将在刷新时从数据库中删除,只剩下新的操作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您的实体User包含Action个数组,并且您使用UserType创建了表单类型data_class => User,Symfony希望您向该表单添加{行动的{1}}字段,因为这就是实体所拥有的。

这就是Symfony的工作方式。就个人而言,我不喜欢模型和表单中实体之间的紧密耦合,但它对于简单的应用程序非常有效。

如果您希望表单类型与任何实体都不匹配,那么事情就不会那么简单,但您可以更好地控制事物。
你有一些选择(据我所知,也许还有其他选择):

  1. 您可以通过创建另一个表示执行操作所需数据的类来移动到基于任务的UI - 在您要编辑用户的情况下,您可以创建{{1} },其中包含1且只有1 collection,只要其他字段,其中大多数可能与您的EditUserCommand类完全相同。
    现在,您可以将表单映射到此Action类,该类只包含1个您想要的操作。显然,稍后您需要使用此命令类来获取编辑用户所需的数据。

  2. 使用收到提交的User的{​​{3}},以便您可以从那里获取提交的数据,并在您想要更新用户时使用它。

  3. 在这两个选项中,您打破了EditUserCommand课程与FormInterface表单之间的耦合,这意味着您需要做更多的工作,但这样做有很多好处。
    您可以在empty_data option with a closure找到关于此主题的进一步阅读。