我正在开发一个可以从日志记录中受益的PHP软件包(在Composer上分发),但并不需要它。我见过很多样本composer.json
文件包含建议的包,如下所示:
{
"suggest": {
"monolog/monolog": "Allows more advanced logging of the application flow"
}
}
如何检测库是否在运行时可用?我希望实例化\Monolog\Logger
的默认实例(如果可用),如果需要,允许包的使用者传递他们自己的Psr\Log\LoggerInterface
接口实现。围绕这个有最佳实践吗?
答案 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实现并且如果它在那里使用它是个好主意。