根据日期时间值更改实体状态
Change entity status depending on datetime value
我有一个 Subscription
实体,它有 status
和 canceledAt
字段。
我希望 status
在 canceledAt
过期时从 active
更改为 canceled
。
所以,我设想在 Subscription::getStatus
方法中检查 canceledAt:
// Subscription.php
public function getStatus()
{
// .... check canceledAt
return $this->status;
}
但这还需要更改 persistence 层的状态。
我应该对事件做些什么吗?
If you don't consider time an input value, think about it until you do - it is an important concept -- John Carmack, 1998
对于简单查询,处理此问题的直接方法是将当前时间作为输入传递
// Subscription.php
public function getStatus(currentTime)
{
// .... check canceledAt
if (currentTime > canceledAt) {
// ....
}
return $this->status;
}
另一方面,如果您尝试做的是影响状态的权威更改,那么您可以在 命令 中将当前时间传递给域模型。
public function onTick(currentTime) {
// ....
}
在某些情况下,通过时钟的域服务表示而不是值来表示时间可能更有意义。重要的一点是应用程序,而不是域模型,负责 "what time is it?"
最后,我创建了一个应用程序服务来获取订阅的状态,这样我就可以将其存储在数据库中以备不时之需。
此外,我从 Subscription
实体中删除了 getStatus
方法。
我不会坚持任何状态。只是 cancelledAt 日期时间。为什么?因为状态取决于当前日期时间。您现在可以保留状态值,但该值可能是错误的,例如下一分钟。然后,从下一分钟起,您将保留一个错误的值。
在我看来,持久化一个随时间变化的值是没有意义的,因为持久化的含义正好相反,是存储一个本身不会变化的值。
我会在请求时计算状态,具体取决于当前日期时间和取消时间,但我不会坚持下去。由于它取决于当前日期时间,因此您应该将当前日期时间视为输入值,就像@VoiceOfUnreason 在他的回答中所说的那样。
我有一个 Subscription
实体,它有 status
和 canceledAt
字段。
我希望 status
在 canceledAt
过期时从 active
更改为 canceled
。
所以,我设想在 Subscription::getStatus
方法中检查 canceledAt:
// Subscription.php
public function getStatus()
{
// .... check canceledAt
return $this->status;
}
但这还需要更改 persistence 层的状态。
我应该对事件做些什么吗?
If you don't consider time an input value, think about it until you do - it is an important concept -- John Carmack, 1998
对于简单查询,处理此问题的直接方法是将当前时间作为输入传递
// Subscription.php
public function getStatus(currentTime)
{
// .... check canceledAt
if (currentTime > canceledAt) {
// ....
}
return $this->status;
}
另一方面,如果您尝试做的是影响状态的权威更改,那么您可以在 命令 中将当前时间传递给域模型。
public function onTick(currentTime) {
// ....
}
在某些情况下,通过时钟的域服务表示而不是值来表示时间可能更有意义。重要的一点是应用程序,而不是域模型,负责 "what time is it?"
最后,我创建了一个应用程序服务来获取订阅的状态,这样我就可以将其存储在数据库中以备不时之需。
此外,我从 Subscription
实体中删除了 getStatus
方法。
我不会坚持任何状态。只是 cancelledAt 日期时间。为什么?因为状态取决于当前日期时间。您现在可以保留状态值,但该值可能是错误的,例如下一分钟。然后,从下一分钟起,您将保留一个错误的值。
在我看来,持久化一个随时间变化的值是没有意义的,因为持久化的含义正好相反,是存储一个本身不会变化的值。
我会在请求时计算状态,具体取决于当前日期时间和取消时间,但我不会坚持下去。由于它取决于当前日期时间,因此您应该将当前日期时间视为输入值,就像@VoiceOfUnreason 在他的回答中所说的那样。