根据日期时间值更改实体状态

时间:2019-08-23 11:18:08

标签: php domain-driven-design hexagonal-architecture

我有一个Subscription实体,其中有statuscanceledAt字段。

我希望status到期后,activecanceled变为canceledAt

因此,我想用Subscription::getStatus方法检查canceledAt:

// Subscription.php

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

     return $this->status;
}

,但这还需要更改持久性层的状态。

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

3 个答案:

答案 0 :(得分:0)

  

如果您不考虑时间是输入值,请仔细考虑直到它成为一个输入值-这是一个重要概念-John Carmack, 1998

对于一个简单的查询,一种简单的处理方法是将当前时间作为输入内容

"os.version": "10.0.17134.950"

另一方面,如果您要执行的操作是对状态进行权威性更改,则可以在 command 中将当前时间传递给域模型。

// Subscription.php

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

    return $this->status;
}

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

答案 1 :(得分:0)

最后,我创建了一个应用程序服务来获取订阅的状态,以便在需要时可以将其存储在数据库中。

此外,我从getStatus实体中删除了Subscription方法。

答案 2 :(得分:0)

我不会保持任何状态。只是canceledAt日期时间。为什么?因为状态取决于当前日期时间。您现在可以保留状态值,但是该值可能是错误的,例如第二分钟。然后,从下一分钟及以后,您将一直保持错误的值。

在我看来,坚持一个随时间变化的值没有意义,因为坚持的含义恰恰相反,就是存储一个本身不会变化的值。

我会在请求时根据当前日期时间和canceledAt计算状态,但是我不会坚持下去。由于它取决于当前日期时间,因此应将当前日期时间视为输入值,例如@VoiceOfUnreason在他的回答中说。