我有一棵Zone
对象树:
class Zone {
protected $parent;
public function __construct(Zone $parent) {
$this->parent = $parent;
}
}
Zone中没有 children
nordescendants
属性,因为我想避免在域模型中管理这些关系的痛苦。
相反,域服务在数据库中维护一个闭包表,以将一个区域映射到它的所有后代,在任何级别。
现在,我有一个User
可以分配一个或多个区域:
class User {
protected $zones;
public function assignZone(Zone $zone) {
$this->zones[] = $zone;
}
}
我的问题是,在为用户分配新区域之前,我想检查该区域是否尚未通过其后代之一显式或隐式分配。
因此,我希望我的控制器将服务暂时注入此方法,以执行必要的检查:
class User {
protected $zones;
public function assignZone(Zone $newZone, ZoneService $zoneService) {
foreach ($this->zones as $zone) {
if ($service->zoneHasDescendant($zone, $newZone)) {
throw new Exception('The user is already assigned this zone');
}
}
$this->zones[] = $zone;
}
}
这是一个好的做法,或者如果不是,那么正确的选择是什么?