__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 实现的接管的单例。
还有什么其他方案嘛?