Zone
私はオブジェクトのツリーを持っています:
class Zone {
protected $parent;
public function __construct(Zone $parent) {
$this->parent = $parent;
}
}
ドメイン モデルでこれらの関係を管理する手間を省きたいので、Zone にはプロパティもプロパティもありません。 children
descendants
代わりに、ドメイン サービスは、データベース内にクロージャ テーブルを保持し、任意のレベルでゾーンをそのすべての子孫にマップします。
これで、User
1 つまたは複数のゾーンを割り当てることができる があります。
class User {
protected $zones;
public function assignZone(Zone $zone) {
$this->zones[] = $zone;
}
}
私の問題は、新しいゾーンをユーザーに割り当てる前に、このゾーンがまだ割り当てられていないことを、その子孫のいずれかを介して明示的または暗黙的に確認したいということです。
したがって、必要なチェックを実行するために、コントローラーで Service をこのメソッドに一時的に挿入する必要があります。
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;
}
}
それは良い習慣ですか、そうでない場合、正しい代替手段は何ですか?