Условно проверить наличие предлагаемого пакета в PHP (Composer)

Я разрабатываю пакет PHP (распространяется на Composer), который может извлечь выгоду из ведения журнала, но не требует этого. Я видел много образцов composer.json файлы, которые включают предлагаемые пакеты, например:

{
    "suggest": {
        "monolog/monolog": "Allows more advanced logging of the application flow"
    }
}

Как мне узнать, доступна ли библиотека во время выполнения? Я хочу создать экземпляр по умолчанию \Monolog\Logger если это возможно, разрешить потребителю посылки передать свой Psr\Log\LoggerInterface реализация интерфейса, если они хотят. Есть ли лучшие практики вокруг этого?

3 ответа

Если вы предлагаете использовать логгер, то разработчик может использовать ваш пакет, чтобы использовать это!

Я бы посоветовал вам полагаться на пакет регистратора PSR-3, чтобы упростить интеграцию, а разработчик сделает все остальное. Не волшебно использовать регистратор, который, по вашему мнению, установлен! Тот Psr\Log\LoggerAwareInterface есть причина.

Я склонен согласиться с ответом Томаша Вотрубы с точки зрения наилучшей практики, но я все равно отвечу на оригинальный вопрос:

Если вы действительно хотите определить, присутствует ли монолог, и применить магию, если она есть, и это действительно относится к любому пакету, проще всего вызвать class_exists('Monolog\Logger') и если это правда, вы знаете, монолог там. Это должно работать, пока у вас нет сломанного автозагрузчика в цепочке, который выдает исключение, когда он не может найти класс, но если вы используете только автозагрузчик Composer, это все хорошо.

Конечно, хорошей идеей будет позволить пользователю внедрить собственную реализацию PSR-3 и использовать ее, если она есть.

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

Необязательная зависимость - это запах кода и магия, которые легко скрыть. Для более глубокого объяснения, оформить заказ Там нет такой вещи, как необязательная статья зависимости.

Другие вопросы по тегам