【问题标题】:Symfony sub-form and entity initializationSymfony 子表单和实体初始化
【发布时间】:2016-01-15 14:39:49
【问题描述】:

假设我有一个实体 User,其 OneToOne 关系称为 friends 与 targetEntity Friend

我有一个类UserType 来构建我的表单,它添加了一个字段friends,构建了一个带有FriendType 类的子表单。

我的两个实体都有一个构造函数,所以我可以初始化它们的一些字段。 当我创建我的表单时(创建时,而不是更新时),构造函数只为用户实体调用,而不是为朋友调用

这是正常行为吗?是否有一个选项可以强制实体 Friend 在提交之前被实例化?

更新

我最终意识到这确实是一种正常的行为。嵌套表单的基础实体使用其构造函数进行初始化。最简单的解决方案是在将实体 User 传递给表单之前为 User 设置一个新的 Friend。

【问题讨论】:

    标签: php forms symfony constructor


    【解决方案1】:

    那是因为用户还没有任何朋友。在您的控制器中,当创建用户实体时,您必须在创建 UserType 之前设置新的朋友,或者在用户构造函数中您可以调用新的朋友构造函数。此外,根据您的需要,可以在具有侦听器的用户的 prePersist 事件上初始化朋友实体。

    【讨论】:

    • 感谢您的回答。我以为它会起作用,但它没有。我在用户的构造函数中设置了一个新朋友,但表单不使用它来填充其字段,我的代码中一定有错误??这很奇怪,表单在更新时可以正常检索数据。我也想知道如何处理 oneToMany 关系。我有一些,用 CollectionType 设置,我不知道我应该“预先实例化”多少。我可能会在表单构建器中使用监听器。我真的希望有一种方法可以强制表单在提交之前创建基础实体,但看起来并非如此。
    • 我通常在控制器中做这种事情,我确信它可以工作。您是否尝试在创建用户类型之前设置好友?
    • 我尝试在控制器中初始化实体,然后将其传递给 formBuilder,但它也不起作用。当我转储实体时,该字段设置正确,并出现在一行上:`-criminalRecord:CriminalRecord {#528 ▶}` 但是在字段列表的末尾,有一个以+号开头的额外字段,说+"setCriminalRecord": CriminalRecord {#527 ▶} 这个没有初始化。
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 2014-12-12
    • 2013-07-14
    相关资源
    最近更新 更多