Как построить систему Exception Logger в PHP, которая может иметь различные реализации Logger, например Файл / БД и тестируемый - PullRequest
0 голосов
/ 27 октября 2010

Я создаю библиотеку PHP, которая выдает различные пользовательские исключения при возникновении ошибок. Мне нужно регистрировать эти исключения и предоставлять различные реализации Logger, чтобы они могли быть зарегистрированы в файле или базе данных.

Исключения должны регистрироваться независимо от того, перехвачены они или нет, так что исключается реализация всего этого в пользовательском обработчике исключений. Поэтому запись в журнал должна запускаться в конструкторе самих пользовательских классов исключений.

Мне также нужно провести модульное тестирование с phpUnit, чтобы исключение вызвало регистратор.

Как лучше всего, чтобы объекты Exception имели доступ к объекту Logger?

У меня были следующие идеи / предложения:

1) Внедрить выбранный объект реализации средства ведения журнала (или его объект Mock при тестировании классов исключений) в объекты, которые генерируют исключения, и эти объекты затем будут вводить объект Logger в конструктор при создании каждого нового исключения. Это может немного запутаться из-за того, что объект Logger передается повсюду.

2) Используйте стратегию или фабричный шаблон (я читал о концепциях, но я не уверен, как реализовать их в этом случае).

1 Ответ

1 голос
/ 27 октября 2010

Это было бы

Я думаю, что подход исключений, имеющих регистратор вместо использования обработчика исключений, ошибочен. ИМО, это нарушает разделение интересов и исключений не должно содержать логику логирования. Однако, если вам нужно это, вы можете создать пользовательское исключение, в котором в качестве статического члена используется составной журнал, но при этом все равно не будет регистрироваться все исключения, не отнесенные к подклассам из этого исключения. Вы можете изменить поведение базового исключения PHP с помощью runkit , но это грязная черная магия вуду.

...