Я создаю библиотеку PHP, которая выдает различные пользовательские исключения при возникновении ошибок. Мне нужно регистрировать эти исключения и предоставлять различные реализации Logger, чтобы они могли быть зарегистрированы в файле или базе данных.
Исключения должны регистрироваться независимо от того, перехвачены они или нет, так что исключается реализация всего этого в пользовательском обработчике исключений. Поэтому запись в журнал должна запускаться в конструкторе самих пользовательских классов исключений.
Мне также нужно провести модульное тестирование с phpUnit, чтобы исключение вызвало регистратор.
Как лучше всего, чтобы объекты Exception имели доступ к объекту Logger?
У меня были следующие идеи / предложения:
1) Внедрить выбранный объект реализации средства ведения журнала (или его объект Mock при тестировании классов исключений) в объекты, которые генерируют исключения, и эти объекты затем будут вводить объект Logger в конструктор при создании каждого нового исключения. Это может немного запутаться из-за того, что объект Logger передается повсюду.
2) Используйте стратегию или фабричный шаблон (я читал о концепциях, но я не уверен, как реализовать их в этом случае).