在PHP(Composer)中有条件地检查建议的包存在

时间:2015-02-19 21:58:14

标签: php composer-php monolog psr-3

我正在开发一个可以从日志记录中受益的PHP软件包(在Composer上分发),但并不需要它。我见过很多样本composer.json文件包含建议的包,如下所示:

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

如何检测库是否在运行时可用?我希望实例化\Monolog\Logger的默认实例(如果可用),如果需要,允许包的使用者传递他们自己的Psr\Log\LoggerInterface接口实现。围绕这个有最佳实践吗?

3 个答案:

答案 0 :(得分:1)

如果您建议使用记录器,则由开发人员使用您的包来使用它!

我建议你依靠PSR-3 logger package来实现轻松集成,让开发人员完成剩下的工作。没有神奇地使用您认为安装的记录器!那个Psr\Log\LoggerAwareInterface是有原因的。

答案 1 :(得分:0)

我建议创建包含所有与monolog相关的逻辑的自定义包。如果有人想使用它,他可以包含它并且它可以工作。

可选的依赖是代码气味和魔法,很容易隐藏。如需更深入的解释,请查看There no such thing as optional dependency文章。

答案 2 :(得分:0)

我倾向于同意TomášVotruba在最佳实践方面的答案,但无论如何我会回答最初的问题:

如果你真的想要检测monolog是否存在并且如果它存在一些魔法,这实际上适用于任何包,最简单的是调用class_exists('Monolog\Logger')如果它是真的你知道monolog就在那里。只要你没有一个破坏的自动加载器,当它找不到一个类时就会抛出一个异常,但是如果你只使用Composer的自动加载器就可以了,这应该可以工作。

当然,让用户注入自己的PSR-3实现并且如果它在那里使用它是个好主意。