Я разрабатываю пакет PHP (распространяется на Composer), который может извлечь выгоду из ведения журнала, но не требует этого. Я видел много образцов composer.json
файлы, которые включают предлагаемые пакеты, например:
{
"suggest": {
"monolog/monolog": "Allows more advanced logging of the application flow"}
}
Как мне узнать, доступна ли библиотека во время выполнения? Я хочу создать экземпляр по умолчанию \Monolog\Logger
если это возможно, разрешить потребителю посылки передать свой Psr\Log\LoggerInterface
реализация интерфейса, если они хотят. Есть ли лучшие практики вокруг этого?
Если вы предлагаете использовать регистратор, то разработчик может использовать ваш пакет, чтобы использовать это!
Я бы посоветовал вам зависеть от PSR-3 регистратор чтобы упростить интеграцию и позволить разработчику сделать все остальное. Не волшебно использовать регистратор, который, по вашему мнению, установлен! Тот Psr\Log\LoggerAwareInterface
есть причина.
Я бы посоветовал создать специальный пакет, который бы включал всю логику, связанную с монологами. Если кто-то хотел бы использовать это, он может включить это, и это работает.
Необязательная зависимость — это запах кода и магия, которые легко скрыть. Для более глубокого объяснения, оформить заказ Там нет такой вещи, как необязательная зависимость статья.
Я склонен согласиться с ответом Томаша Вотрубы с точки зрения наилучшей практики, но я все равно отвечу на оригинальный вопрос:
Если вы действительно хотите определить, присутствует ли монолог, и применить магию, если она есть, и это действительно относится к любому пакету, проще всего вызвать class_exists('Monolog\Logger')
и если это правда, вы знаете, монолог там. Это должно работать, пока у вас нет сломанного автозагрузчика в цепочке, который выдает исключение, когда он не может найти класс, но если вы используете только автозагрузчик Composer, это все хорошо.
Конечно, хорошей идеей будет позволить пользователю внедрить собственную реализацию PSR-3 и использовать ее, если она есть.