【问题标题】:Immutable collections in Doctrine 2?Doctrine 2 中的不可变集合?
【发布时间】:2011-09-10 23:22:55
【问题描述】:

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

class User
{
    // ...

    public function getGroups()
    {
        return $this->groups;
    }
}

// ...
$user = new User();
$user->getGroups()->add($group);

DDD 的角度来看,如果User 是聚合根,那么我们更愿意:

$user = new User();
$user->addGroup($group);

但是,如果我们确实也需要 getGroups() 方法,那么理想情况下我们不希望返回对集合的内部引用,因为这可能会让某人绕过 addGroup() 方法。

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

    public function getGroups()
    {
        return new ImmutableCollection($this->groups);
    }

【问题讨论】:

    标签: orm collections doctrine domain-driven-design doctrine-orm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我想最简单的方法是使用iterator_to_array

      iterator_to_array 将可迭代对象转换为数组,因此无需直接返回集合,您只需执行return iterator_to_array($this->foo);

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

      【讨论】:

      • 确实是优秀的解决方案。谢谢!
      • 刚刚注意到return $this->groups->toArray(); 产生了相同的结果!
      • 如果您想保留 ArrayCollection 功能,也可以使用return new ArrayCollection($this->groups->toArray());
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2011-03-11
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多