У меня есть дерево Zone
объектов:
class Zone {
protected $parent;
public function __construct(Zone $parent) {
$this->parent = $parent;
}
}
В Зоне есть нет children
или descendants
свойств, потому что я хочу избежать болиуправления этими отношениями в модели предметной области.
Вместо этого доменная служба поддерживает таблицу замыканий в базе данных для сопоставления зоны со всеми ее потомками на любом уровне.
Теперь яиметь 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;
}
}
Isэто хорошая практика, или если нет, то какова правильная альтернатива?