【问题标题】:Conditionally check suggested package existence in PHP (Composer)有条件地检查 PHP (Composer) 中是否存在建议的包
【发布时间】:2015-04-21 11:18:21
【问题描述】:

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

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

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

【问题讨论】:

标签: php composer-php monolog psr-3


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2023-01-02
        • 2020-02-09
        相关资源
        最近更新 更多