Вы можете отправлять сообщения от одного доменного объекта другому. Только объекты, способные генерировать определенные сообщения, будут вызывать данный метод. Фрагмент кода ниже. Это решение предназначено для проектов, в которых внедрение зависимостей является своего рода религией, как здесь PHP + DDD .
Служба бронирования получает фабрику сообщений. Фабрика вводится через метод конструктора. Объекты, у которых нет этой фабрики, не могут выдавать подобные сообщения. (Конечно, вы должны ограничивать создание объектов фабриками.)
class Domain_ReservationService
{
private $changeStatusRequestFactory;
public function __construct(
Message_Factory_ChangeStatusRequest $changeStatusRequestFactory
) {
$this->changeStatusRequestFactory = $changeStatusRequestFactory;
}
public function confirmReservation(Domain_Reservation $reservation) {
$changeStatusRequest = $changeStatusRequestFactory->make(
Reservation::STATUS_CONFIRMED
);
$reservation->changeStatus($changeStatusRequest);
// commit changes to the db, send notifications, etc.
}
}
Объект Reservation проверяет содержимое сообщения и решает, что делать.
class Domain_Reservation
{
public function changeStatus(
Message_Item_ChangeStatusRequest $changeStatusRequest
) {
$satus = $changeStatusRequest->getStatus();
...
}
}
Объект сообщения является объектом значения DDD. (Иногда это действует как стратегия.)
class Message_Item_ChangeStatusRequest
{
private $status;
public function __construct( $status ) {
$this->$status = $status;
}
public function getStatus() {
return $this->$status;
}
}
Эта фабрика производит сообщения.
class Message_Factory_ChangeStatusRequest
{
public function make($status) {
return new Message_Item_ChangeStatusRequest ($status);
}
}
Все доменные объекты создаются этой фабрикой слоев.
class Domain_Factory
{
public function makeReservationService() {
return new Domain_ReservationService(
new Message_Factory_ChangeStatusRequest()
);
}
public function makeReservation() {
return new Domain_Reservation();
}
}
Указанные выше классы могут использоваться в вашем приложении следующим образом.
$factory = new Domain_Factory();
$reservationService = $factory->makeReservationService();
$reservation = $factory->makeReservation();
$reservationService->confirmReservation($reservation);
Но я не понимаю, почему вы не хотите использовать $ booking-> beConfirmed () вместо передачи констант статуса.