3

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

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

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

4

3 回答 3

1

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

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

于 2015-02-19T23:58:01.890 回答
0

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

如果你真的想检测 monolog 是否存在并做一些魔法,这真的适用于任何包,最简单的方法是调用class_exists('Monolog\Logger') ,如果它是真的,你知道 monolog 在那里。只要您在找不到类时抛出异常的链中没有损坏的自动加载器,这应该可以工作,但是如果您只使用 Composer 的自动加载器,那一切都很好。

当然,让用户注入他们自己的 PSR-3 实现并在它存在时使用它是一个好主意。

于 2015-02-22T22:23:58.077 回答
0

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

可选依赖是代码气味和魔法,很容易隐藏。如需更深入的解释,请查看没有可选依赖项之类的文章。

于 2015-02-19T22:22:00.373 回答