gpt4 book ai didi

PHP & DDD : How to ensure that only a Service can call a method on an entity?

转载 作者:行者123 更新时间:2023-12-02 01:18:34 27 4
gpt4 key购买 nike

我正在使用域模型,其中有一个 Reservation 类:

class Reservation
{
public function changeStatus($status) { ... }
}

因为 changeStatus() 方法只能在发送所有适当通知(电子邮件,...)的上下文中调用我想将对此方法的调用限制为 预订服务:

class ReservationService
{
public function confirmReservation(Reservation $reservation)
{
$reservation->changeStatus(Reservation::STATUS_CONFIRMED);
// commit changes to the db, send notifications, etc.
}
}

因为我正在使用 PHP,所以没有包可见性友元类 这样的概念,所以我的changeStatus() 方法只是公开的,因此可以从应用程序的任何地方调用。

我发现这个问题的唯一解决方案是使用某种双重调度:

class Reservation
{
public function changeStatus(ReservationService $service)
{
$status = $service->getReservationStatus($this);
$this->setStatus($status);
}

protected function setStatus($status) { ... }
}

潜在的缺点是:

  • 这让设计有点复杂
  • 这让实体了解服务,不确定这是否真的是缺点

你们对上述解决方案有什么意见,或者有更好的设计建议限制对这个changeStatus()方法的访问吗?

最佳答案

使用一个强制执行您需要的上下文的接口(interface):

interface INotifiable {
public function updated( $reservation );
}

class Reservation {
public function changeStatus( $status, INotifiable $notifiable ){
$this->setStatus( $status );
$notifiable->updated( $this );
}
}

class EmailNotifier implements INotifiable {
public function updated( $reservation ){
$this->sendUpdateEmail( $reservation ); //or whatever
}
}

预订不需要知道任何关于服务的信息。另一种方法是在 Reservation 上定义事件,但这会增加您可能不需要的复杂性。

关于PHP & DDD : How to ensure that only a Service can call a method on an entity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8050171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com