2

我想让实体记录最近修改过实体的用户(最好是他的 ID)。我认为一个漂亮的实体有一个 getModifier() 方法,但没有 setModifier() ,因为它是由类作为内部事务处理的。我会使用一些 prePersist 来使用用户 ID 更新实体。所以这里有两个主要问题:

1) 从技术上讲,如何在实体的 prePersist 中获取当前用户的 ID?

2)哲学。我找到了很多答案,建议我重新考虑我的模型,不要依赖于存储在其中的数据以外的任何东西。我看不出将实体与世界其他地方隔离开来是多么理智:请看这里关于实体可以做什么的两个对比。访问服务以获取可以存储某些缓存输出的文件夹名称被认为是非法的;虽然使用文件抽象类写入文件系统是可以的;我认为后者对文件系统做出了更多假设。访问当前用户的身份被认为是非法的;同时将当前时间戳放在实体上是可以的;所以(可能缺少)用户的概念是坏的,而时间的概念是好的?如果不依赖模型本身以外的任何东西的概念是有效的,那么还有人敢使用 DateTime 函数吗?(请不要说 PHP 的服务总是可以访问的,因为一些缺少的设置/扩展很容易导致这些失败。)我看不到如何在遵守如此严格的限制的同时将任何逻辑构建到实体中,以及如何避免实体最终只是数据(通过这种级别的封装和信息隐藏,这个实体模型提供给我的只是数组)。谁能指出我不能使用的模型环境元素和那些被认为是合法的元素之间的特殊区别是什么?并不是说 PHP 的服务总是可以访问的,因为一些缺少的设置/扩展很容易导致这些失败。)我看不到如何在遵守如此严格的限制的同时将任何逻辑构建到实体中,以及如何避免实体结束最多不过是数据(通过这种级别的封装和信息隐藏,这个实体模型提供给我的只是数组)。谁能指出我不能使用的模型环境元素和那些被认为是合法的元素之间的特殊区别是什么?并不是说 PHP 的服务总是可以访问的,因为一些缺少的设置/扩展很容易导致这些失败。)我看不到如何在遵守如此严格的限制的同时将任何逻辑构建到实体中,以及如何避免实体结束最多不过是数据(通过这种级别的封装和信息隐藏,这个实体模型提供给我的只是数组)。谁能指出我不能使用的模型环境元素和那些被认为是合法的元素之间的特殊区别是什么?以及如何避免实体最终只是数据(通过这种级别的封装和信息隐藏,这个实体模型提供给我的只是数组)。谁能指出我不能使用的模型环境元素和那些被认为是合法的元素之间的特殊区别是什么?以及如何避免实体最终只是数据(通过这种级别的封装和信息隐藏,这个实体模型提供给我的只是数组)。谁能指出我不能使用的模型环境元素和那些被认为是合法的元素之间的特殊区别是什么?

4

1 回答 1

2

让我把我的答案分成两部分:

关于 1)

你不能。学说很难做到这一点。虽然您在 2) 中的问题将在下面讨论,但我们可以这样说:普遍的理解是,模型不知道作为服务的东西,而是被服务用来使它们可重用。

为什么不组合 setter 并为组合的 setter 添加一个 $user 属性,像这样设置修饰符:

public function setAttributes($user, $attr1, $attr2)
{
    $this->modifier = $user;
    $this->attr1 = $attr1;
    $this->attr2 = $attr2;
}

当然,您也可以将用户添加到每个 setter。

当然,还有其他方法。例如,您可以添加一个非持久性属性activeUser并在 prePersist 上使用它,或者如果未设置则抛出异常。

关于2)

首先,让我们承认有两种思想流派。一是模型可以保存业务逻辑并且可以使用其他类,但不应该依赖于更大的图景,这意味着它们不应该从调用者那里获取复杂的对象。另一个(我在这个)是模型应该是不应该包含业务逻辑的转储数据存储。

两人都认为模型应该或多或少愚蠢。如果您查看活动记录(由 symfony 1 和 RoR 使用),您会看到另一个模型概念,这些模型知道它们的上下文,例如必须了解数据库。虽然这有一些优点(比如你可以从内部保存模型,或者你可以让它知道哪个用户现在在对它进行操作),但你也有很大的缺点(比如模型依赖于一个很好的上下文,因此很难迁移它甚至测试ist)。

Doctrine 不使用 Active Record,因此您将不得不忍受这种或多或少的“转储对象”,或者将 ORM 与使用 Active Record 概念的 ORM(如Redbeanphp)交换。

于 2012-10-14T19:56:16.933 回答