如何在PHP中构建可以具有不同Logger实现的异常记录器系统,例如文件/数据库并且是可测试的

时间:2010-10-27 09:10:43

标签: php unit-testing phpunit exception-logging

我正在构建一个PHP库,在遇到错误时抛出各种自定义异常。我需要记录这些异常并提供Logger的各种实现,以便它们可以记录在文件或数据库中。

无论是否捕获都需要记录异常,因此排除在自定义异常处理程序中实现任何此异常。因此,需要在自定义Exception类本身的构造函数中触发日志记录。

我还需要使用phpUnit进行单元测试,以便Exception触发Logger。

Exception对象有权访问Logger对象的最佳方法是什么?

我的想法/建议包括:

1)将所选的记录器实现对象(或测试Exception类时的Mock对象)注入到抛出异常的对象中,然后这些对象在抛出每个新异常时将Logger对象注入构造函数。虽然Logger对象遍布整个地方,但这可能会有点混乱。

2)使用策略或工厂模式(我已经阅读了概念,但在这种情况下我不确定如何实现这些概念)。

1 个答案:

答案 0 :(得分:1)

那将是

我认为使用记录器而不是使用异常处理程序的Exceptions方法存在缺陷。 IMO,它违反了关注点的分离,异常不应包含日志记录逻辑。但是,如果必须这样做,则可以创建一个自定义异常,该异常具有作为静态成员的记录器组合,但这仍然会使您没有记录此异常中没有子类的所有异常。您可以使用runkit更改PHP基本异常的行为,但这是脏黑巫毒魔法monkeypatching。