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 的工作方式。就我个人而言,我不喜欢模型和表单中实体之间的这种紧密耦合,但它对于简单的应用程序来说效果很好。
如果你想要一个不匹配任何实体的表单类型,事情就不会那么简单了,但你会拥有更多的控制权。
您有一些选择(据我所知,也许还有其他选择):
您可以移动到基于任务的 UI,方法是创建另一个 class 代表您执行操作所需的数据 - 在您的情况下您想要编辑一个用户,所以你可以创建一个EditUserCommand
,其中包含1个并且只有1个Action
,只要其他字段,大部分可能和你的User
完全一样class.
现在您可以将您的表单映射到此 EditUserCommand
class,它将只包含您想要的 1 个操作。显然后面你需要使用这个命令class来获取你需要编辑用户的数据
使用接收提交的FormInterface
的empty_data
option with a closure,这样你就可以从那里获取提交的数据,并在你想更新用户时使用它。
在这两个选项中,你打破了你的 User
class 和你的 EditUserType
形式之间的耦合,这意味着你需要做更多的工作,但我认为它有很多好处。
您可以找到有关此主题的进一步阅读 here。
我正在构建一个简单的表单,该表单具有来自 User
实体的 one-to-many
关系:
User 1..* actions
所以基本上,在我的用户表单中,我必须将 actions
属性 设置为 collection
表单类型。
我不希望客户端能够在表单中添加多个操作,而在编辑用户时只能添加一个。
问题是 Symfony 2 表单期望从 submit
上的表单获取所有操作,因此现有操作在刷新时从数据库中删除,只保留新操作。
有什么想法吗?
如果您的实体 User
有一个 Action
数组,并且您使用 data_class => User
创建了一个表单类型 UserType
,Symfony 希望您添加到该表单collection
操作字段,因为这是实体所具有的。
这就是 Symfony 的工作方式。就我个人而言,我不喜欢模型和表单中实体之间的这种紧密耦合,但它对于简单的应用程序来说效果很好。
如果你想要一个不匹配任何实体的表单类型,事情就不会那么简单了,但你会拥有更多的控制权。
您有一些选择(据我所知,也许还有其他选择):
您可以移动到基于任务的 UI,方法是创建另一个 class 代表您执行操作所需的数据 - 在您的情况下您想要编辑一个用户,所以你可以创建一个
EditUserCommand
,其中包含1个并且只有1个Action
,只要其他字段,大部分可能和你的User
完全一样class.
现在您可以将您的表单映射到此EditUserCommand
class,它将只包含您想要的 1 个操作。显然后面你需要使用这个命令class来获取你需要编辑用户的数据使用接收提交的
FormInterface
的empty_data
option with a closure,这样你就可以从那里获取提交的数据,并在你想更新用户时使用它。
在这两个选项中,你打破了你的 User
class 和你的 EditUserType
形式之间的耦合,这意味着你需要做更多的工作,但我认为它有很多好处。
您可以找到有关此主题的进一步阅读 here。