我想让实体记录最近修改过实体的用户(最好是他的ID)。我认为一个漂亮的实体有一个getModifier()方法但没有setModifier(),因为它被类作为内部事务处理。我使用一些prePersist来更新具有用户ID的实体。所以这里有两个主要问题:
1)从技术上讲,如何在实体的prePersist中获取当前用户的ID?
2)哲学。我找到了很多答案,建议我重新考虑我的模型,不要依赖于存储在其中的数据。我没有看到来自世界其他地方的孤立实体是如何理智的:在这里看到两个对比,即允许实体做什么。访问服务以获取可以存储某些缓存输出的文件夹名称被认为是非法的;用文件抽象类写文件系统是可以的;我认为后者对文件系统做了更多的假设。访问当前用户的身份被视为非法;将当前时间戳放在实体上是可以的;所以(可能缺失的)用户的概念是坏的,而时间的概念是好的?如果关于不依赖于模型本身以外的任何东西的概念是有效的那么谁有人敢如何使用DateTime函数? (请不要说PHP的服务总是可以访问,因为一些丢失的设置/扩展很容易导致这些失败。)我没有看到如何在遵守这些严格限制的同时将任何逻辑构建到实体中,以及如何避免这些实体最终只是数据(通过这种封装和信息隐藏级别,这个实体模型不仅仅为数组提供了任何东西)。任何人都可以指出我必须不使用模型环境的那些元素与那些被认为合法的元素之间的特殊区别是什么?
答案 0 :(得分:2)
让我将答案分为两部分:
关于1)
你做不到。这对于学说来说很难实现。虽然下面将讨论2)中的问题,但我们可以这样说:常见的理解是模型不知道服务的东西,但是服务使用它们使它们可以重用。
为什么不组合setter并将$ user属性添加到组合setter中,设置修饰符如下:
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 Records概念的ORM交换(如Redbeanphp)。