首页 > 解决方案 > 根据日期时间值更改实体状态

问题描述

我有一个具有和字段的Subscription实体。statuscanceledAt

我想status从过期时间更改active为。canceledcanceledAt

所以,我想在方法中检查 cancelledAt Subscription::getStatus

// Subscription.php

public function getStatus()
{
     // .... check canceledAt

     return $this->status;
}

但这也需要更改持久层的状态。

我应该对事件做些什么吗?

标签: phpdomain-driven-designhexagonal-architecture

解决方案


如果您不将时间视为输入值,请考虑它直到您这样做——这是一个重要的概念——John Carmack,1998

对于简单的查询,处理此问题的直接方法是将当前时间作为输入传递

// Subscription.php

public function getStatus(currentTime)
{
    // .... check canceledAt
    if (currentTime > canceledAt) {
        // ....
    }

    return $this->status;
}

另一方面,如果您尝试做的是影响状态的权威更改,那么您可以在命令中将当前时间传递给您的域模型。

public function onTick(currentTime) {
    // ....
}

在某些情况下,通过时钟的域服务表示而不是值来表示时间可能是有意义的。重要的一点是应用程序,而不是域模型,负责“现在几点?”


推荐阅读