Service 如何在Symfony 2实体中存储修改器用户

Service 如何在Symfony 2实体中存储修改器用户,service,symfony,model,entity,Service,Symfony,Model,Entity,我想让实体记录最近修改实体的用户(最好是他的ID)。我认为一个漂亮的实体有一个getModifier()方法,但没有setModifier(),因为这是由类作为内部事务处理的。我会使用一些prePersist用用户ID更新实体。因此,这里有两个主要问题: 1) 从技术上讲,如何在实体的prePersist中获取当前用户的ID 2) 哲学。我找到了很多答案,建议我重新思考我的模型,不要依赖于其中存储的数据以外的任何东西。我看不出将实体与世界其他地方隔离是如何明智的:在这里,我们可以看到关于实体可以

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

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


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

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

关于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使用),您会看到另一个模型概念,这些模型了解其上下文,例如必须了解数据库。虽然这有一些优点(比如你可以从模型内部保存模型,或者你可以让它知道现在哪个用户在对它进行操作),但是你也有很大的缺点(比如模型依赖于一个好的上下文,这使得它很难迁移甚至测试)


条令不使用活动记录,因此您将不得不或多或少地接受这种“转储对象”,或者与使用活动记录概念的ORM(如)交换ORM。

解决方案将实现条令行为,使用容器获取当前用户。我不想和愚蠢的实体一起去。我需要能够将我的实体安全地传递给客户机代码,并假设为了OOP的缘故,可以使这些类“照顾自己”,它们的接口就足够了,并且不超过操作它们所表示的数据所需的数量。对于简单的条令实体,这是不可能的,如果没有行为,我也可以使用数组(