Orm 条令2中的不可变集合?

Orm 条令2中的不可变集合?,orm,collections,doctrine,domain-driven-design,doctrine-orm,Orm,Collections,Doctrine,Domain Driven Design,Doctrine Orm,我正在寻找一种方法,从原则2中的域对象返回一个不可变的集合。让我们从下面的示例开始: 类用户 { // ... 公共函数getGroups() { 返回$this->groups; } } // ... $user=新用户(); $user->getGroups()->添加($group); 从某种角度来看,如果User是聚合根,那么我们更喜欢: $user=新用户(); $user->addGroup($group); 但是,如果我们确实也需要getGroups()方法,那么理想情况下,我

我正在寻找一种方法,从原则2中的域对象返回一个不可变的集合。让我们从下面的示例开始:

类用户
{
// ...
公共函数getGroups()
{
返回$this->groups;
}
}
// ...
$user=新用户();
$user->getGroups()->添加($group);
从某种角度来看,如果
User
是聚合根,那么我们更喜欢:

$user=新用户();
$user->addGroup($group);
但是,如果我们确实也需要
getGroups()
方法,那么理想情况下,我们不希望返回对集合的内部引用,因为这样可能会允许有人绕过
addGroup()
方法

除了创建自定义的、不可变的集合代理之外,是否有一种内置的方法来返回不可变集合?比如

公共函数getGroups()
{
返回新的ImmutableCollection($this->groups);
}

我认为实现这一点最简单的方法是使用

iterator\u to\u array
将iterable对象转换为数组,因此您不需要直接返回集合,只需执行
return iterator\u to\u array($this->foo)

这还有一个额外的好处,就是可以在返回的列表上使用类似于
array\u map
的函数,因为它们不适用于类似于array的对象。

最简单(也是推荐的)方法是:

return$this->groups->toArray();

这确实是一个很好的解决方案。谢谢刚刚注意到
return$this->groups->toArray()产生相同的结果!您还可以执行
返回新的ArrayCollection($this->groups->toArray())如果要保留ArrayCollection功能