【问题标题】:Symfony2 collection field by_reference=false vs. setterSymfony2 集合字段 by_reference=false vs. setter
【发布时间】:2012-10-31 22:27:20
【问题描述】:

我有一个带有标签字段的表单。 Tags 是绑定实体上的 Doctrine ArrayCollection。正如文档建议的那样,该字段是 by_reference=false ,但是在添加新元素时将表单绑定到实体是非法行为,如下所示:

$data=$entity->getTags(); //gets the ArrayCollection but does not care that it is not an array, and shoulrd be converted first
//do the value modifications like:
$data[]=new Tag(...);
$entity->setTags($data); //poor setter gets called with the already-updated collection, this operation is pointless

我认为 by_reference false 是为了避免这个问题。如果是,那么它出现故障。如果不是,那么文档很差,有一个 ArrayCollections 的例子,但不关心这种对设置器的非常残酷的忽视......

我应该改用什么?在 getter 中返回 toArray() 是行不通的(显然设计模型以兼容较差的表单实现是不明智的。是否可能有类似于“集合”的类型强制转换为数组?

【问题讨论】:

  • 对不起,我可能一直在混淆:问题中的代码旨在说明 FormType 的行为方式,它不是我的代码。除了 $form->bindRequest(...) 和字段定义之外,我真的没有这个特定方面的代码。
  • 2.0(我想移植到 2.1,但现在买不起)。

标签: symfony collections arraycollection fieldtype


【解决方案1】:

将标签添加到实体,因为它应该发生:

$new_tag = new Tag(...);
$entity->addTag($new_tag);

在基本的 Doctrine 生成实体中没有集合的集合函数。

【讨论】:

  • 1) 没有 addTag() 也不需要它(所以我不会创建它,因为“数据模型应该独立”的座右铭是我呼吸的空气——除非我希望在 symfony 可怕的指导方针中窒息)。 2)我有一个二传手。教义为我生成了它。我在 docs 文档中读到的内容也是如此,因此您可能会误会。 3)你挖不明白一个问题。我不想要一个解决方案,而不是我发布的代码来说明 FormType 会产生什么样的失败,而是一种避免失败的方法……我显然不想更改 FormType 的代码……
  • 我没有弄错 Doctrine 为 MoreToSomething 关系生成了一个附加函数而不是一个集合,是的,我可能不理解你的问题,因为在代码示例中你想找到添加额外“标签”的方法”。我不认为我有你试图找到的答案。希望其他人可以帮助您。
  • 无论如何,谢谢。抱歉我的错误,实体可能是用 Symfony 的生成器而不是教义的生成器生成的。
猜你喜欢
  • 2016-01-26
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多