__destruct
里抛出异常已经不会产生致命错误了
场景是用户操作日志,laravel 框架,所有模型事件都实现了一个接口类ChangesLoggerInterface
,然后当任意一个模型触发任意事件都会进到一个 ChangesLoggerListener
的监听器中。
然后想实现:
当 saved\updated\deleted 的时候记录下哪些字段从 xx 改成了 bb 。
然后一次请求中肯定不止一个对象发生变动可能是多个比如电商下单接口可能会是order:saved,user:updated(last_order_dateline)
。
所以最终是实现在一次请求中记录一行数据(在 logs 表中)。
所以在 ChangesLoggerListener
中 想调用一个 Logger
的日志记录类,调用Logger::push
,这样在当 Logger 触发__destruct
的时候获取 $this->data(array)
拼成一行数据入库。
问题是:
__destruct
必须是在refcount
为 0 的时候才触发。所以如果业务逻辑里有 try...catch..
的时候,实际上__destruct
里的异常是不会被 catch 到的。
造成 refcount
不为 0 的原因是因为用了 Laravel 的 Facade 实现的接管的单例。
还有什么其他方案嘛?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.