我正在用DDD方法开始一个小项目。我用纯PHP创建了包含Entities和ValueObjects的域模型。实体引用了它们的关联 - 在我的例子中,有一个Employee
实体,其所属的Teams
集合,我将它们保存在Employee::teams
属性中。一切都很顺利,我已经为那些在YAML中有关联的实体创建了映射,在Symfony2和Doctrine2层中实现了存储库的接口等等。
当我从存储库(使用Doctrine的Employee
)而不是EntityManager::findAll()
数组中获取Team
时,我会收到PersistentCollection
这些团队。它基于PHP7构建,Employee::getTeams()
的返回类型为array
,所以我得到了关键的异常。
有没有办法将它转换为数组与一些外部侦听器(仅限Symfony层,以免混淆域文件)或任何其他核心机制?
感谢。
答案 0 :(得分:0)
你得到了ArrayCollection
http://www.doctrine-project.org/api/common/2.5/class-Doctrine.Common.Collections.ArrayCollection.html
它有toArray()
方法,所以你可以写
/**
* @return Team[]
*/
public function getTeams(): array
{
return $this->teams->toArray();
}
但我更喜欢
/**
* @return Team[]|ArrayCollection
*/
public function getTeams()
{
return $this->teams;
}
如果您使用像PhpStorm这样的好IDE,它会正确理解它以像ArrayCollection一样自动填充它,如果你Team
foreach ($employee->getTeams() as $team) {...
ArrayCollection比普通数组更强大。例如,您可以过滤和排序它们,Doctrine将生成优化的SQL,因此您不必加载所有项目 http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections
答案 1 :(得分:0)
库巴,
这似乎不是DDD问题,而是关于PHP实现细节的技术问题。 但是,请让我跳转到您的设计,并尝试为您的域找到更好的解决方案。您缺少模拟员工与团队之间的关系,让我们称之为团队中的员工。你这样做的方式是强迫AR引用另一个AR,这就是员工管理团队生命周期的方式。情况可能并非如此,但在特定情况下,另一个参与者可能会更改团队的状态,这可能会破坏团队AR上的员工不变量。因此,当您创建AR以管理另一个AR生命周期时,不应通过存储库找到此依赖关系,并且聚合的根目前处于强制围绕聚合AR的不变的位置。 还有一些值得一提的问题,但为了保持简单,请继续为您缺少的概念建模:EmployeeInTeam或您想要的任何内容。它引用了员工和团队的概念身份,因此您可以在将来安全地删除它,您可以查询团队中的员工以及员工所属的团队。 如果您需要框架或数据库来保持一致性,那么您就不会使用DDD。仅使用对象,而不是技术。
此致 塞巴斯蒂安。