1

假设你的包使用了一些 RESTful 服务并且可以与两个不同的 PHP HTTP 客户端一起工作: guzzle / guzzle以及kriswallsmith/Buzz。因为它使用适配器和接口。

如何将此依赖项定义为可选?你会做这样的事情吗,例如在编译器传递中?

if(!is_file('/path/to/guzzle') && !is_file('/path/to/buzz')) {
    throw new \RuntimeException('You need to install guzzle or Buzz browser.');
}

这是为捆绑包定义可选依赖项的正确方法吗?

4

1 回答 1

2

首先,您不会像上面那样做,主要是因为检查文件是否存在于某个路径将不起作用。如果用户将它们安装在其他地方(无论出于何种原因)并设法获得正确的命名空间怎么办?

我的第一个问题是您为什么希望用户选择。有什么区别吗?用户是否甚至能够决定使用哪个客户端。例如,当我使用资产时,我当然必须决定要使用哪些过滤器,因为它们对发生的事情有很大的影响(例如,如果我有 scss 文件,那么更少的过滤器是无用的)。

还有其他问题,例如用户必须自己管理依赖项。有时这是值得的,有时则不值得。

现在,如果您决定让用户选择,我会选择一个配置选项,用户可以通过字符串 guzzle 或字符串蜂鸣。也许有一个默认值。

在您的包中,您尝试根据此配置创建对象。你可以用 try catch 块包围它来捕捉丢失的依赖项或查看某个类是否可用。如前所述,您不会测试某个文件的存在,而是使用 php 函数测试某个类的存在class_exists。你的测试应该在你真正想要使用的一个或多个类上。

于 2012-11-26T22:49:21.660 回答