Orm 条令2中的不可变集合?
我正在寻找一种方法,从原则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()方法,那么理想情况下,我
类用户
{
// ...
公共函数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功能