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

Symfony 2 Forms one to many without collection (only add one item)

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

User 1..* actions

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

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

问题是 Symfony 2 表单期望从 submit 上的表单获取所有操作,因此现有操作在刷新时从数据库中删除,只保留新操作。

有什么想法吗?

如果您的实体 User 有一个 Action 数组,并且您使用 data_class => User 创建了一个表单类型 UserType,Symfony 希望您添加到该表单collection 操作字段,因为这是实体所具有的。

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

如果你想要一个不匹配任何实体的表单类型,事情就不会那么简单了,但你会拥有更多的控制权。
您有一些选择(据我所知,也许还有其他选择):

  1. 您可以移动到基于任务的 UI,方法是创建另一个 class 代表您执行操作所需的数据 - 在您的情况下您想要编辑一个用户,所以你可以创建一个EditUserCommand,其中包含1个并且只有1个Action,只要其他字段,大部分可能和你的User完全一样class.
    现在您可以将您的表单映射到此 EditUserCommand class,它将只包含您想要的 1 个操作。显然后面你需要使用这个命令class来获取你需要编辑用户的数据

  2. 使用接收提交的FormInterfaceempty_data option with a closure,这样你就可以从那里获取提交的数据,并在你想更新用户时使用它。

在这两个选项中,你打破了你的 User class 和你的 EditUserType 形式之间的耦合,这意味着你需要做更多的工作,但我认为它有很多好处。
您可以找到有关此主题的进一步阅读 here