我们有一个网站,人们可以在其中更改模型(帖子和主题)之间的关系。用户可以向帖子添加主题。管理员可以更改它,其他系统(例如crons)可以更改它等。我们想记录这个,这样我们就可以知道变化是什么以及由谁制造的。
问题在于此日志记录所属的位置。我们不想将它放在控制器中,因为任何其他流程(如crons)或其附带的内容可能会被遗忘。
但是将日志记录逻辑放入模型中似乎很奇怪 - 但我不确定如何做到这一点。
答案 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。然后,您可以决定何时提出有关某些重要数据更改的事件(在控制器层或模型中),并且已注册的侦听器将获取此事件并写入日志。在将来,也许你会发现附加另一个监听器来做更多事情是有用的。刷新一些统计数据等。