如何处理模型更改的日志记录?

时间:2015-01-15 07:42:45

标签: oop logging model

我们有一个网站,人们可以在其中更改模型(帖子和主题)之间的关系。用户可以向帖子添加主题。管理员可以更改它,其他系统(例如crons)可以更改它等。我们想记录这个,这样我们就可以知道变化是什么以及由谁制造的。

问题在于此日志记录所属的位置。我们不想将它放在控制器中,因为任何其他流程(如crons)或其附带的内容可能会被遗忘。

但是将日志记录逻辑放入模型中似乎很奇怪 - 但我不确定如何做到这一点。

2 个答案:

答案 0 :(得分:3)

创建指定的日志控制器(附带型号),并从需要记录的所有其他控制器中调用它。 这样您就不会将逻辑放在模型中,并且它可以集中用于其他可能需要使用它的控制器或API。

答案 1 :(得分:2)

在像Hibernate(Java),Doctrine(PHP)这样的流行ORM中,您可以为实体生命周期事件注册侦听器。您可以使用此类模式注册记录器。

这里有关于教条生命周期事件的一些解释 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

基本上,框架为您提供了一种通过将注释用于要使用ORM保留的任何实体来附加事件侦听器的方法。 你可以创建f.e.通用EntityChangesLoggingListener并将其作为侦听器附加到您的所有实体。 在将实体更改的字段保存到数据库之前或之后,将向监听器提供有关已更改字段的详细信息 - 所有信息都在事件对象中提供。 你可以简单地将这些细节放到任何你喜欢的日志中。

优点:

  • 您的记录器与模型松散耦合 - 仅通过注释。
  • 您的记录器非常接近数据存储保存操作,因此在实施修改给定实体状态的某些新功能期间,您将跳过记录更改的风险很小。
  • 如果您想将日志记录存储在与实体相同的数据库中,如果您愿意,可以在单个数据库事务中轻松执行这些操作

如果你决定登录控制器层@Avi Kehat建议我看到一些缺点

  • 控制器是您处理数据的第一层,因此存在很大的风险,即在用户操作和日志记录操作之间中间会出现故障。 因此你将没有日志。
  • 如果您从其他所有控制器调用日志控制器,则日志记录将与域操作绑定

如果您不使用任何支持处理实体生命周期事件的ORM,那么我会使用一些EventDispatcher。然后,您可以决定何时提出有关某些重要数据更改的事件(在控制器层或模型中),并且已注册的侦听器将获取此事件并写入日志。在将来,也许你会发现附加另一个监听器来做更多事情是有用的。刷新一些统计数据等。