假设您的捆绑包使用一些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.');
}
这是为bundle定义可选依赖项的正确方法吗?
答案 0 :(得分:2)
首先,你不会像上面那样做,主要是因为检查某些路径中是否存在文件是行不通的。如果用户将它们安装在其他地方(无论出于何种原因)并设法使命名空间正确,该怎么办?
我的第一个问题是您希望用户选择的原因。有什么区别吗?用户是否能够决定使用哪个客户端。例如,当我使用资产时,我当然必须决定我想要使用哪些过滤器,因为它们对发生的事情有很大的影响(例如,如果我有scss文件,则较少的过滤器是无用的)。
还有其他问题,例如用户必须自己管理依赖关系的问题。有时这是值得的,有时它不是。
现在,如果你决定要用户选择,我会选择一个配置选项,用户可以通过字符串guzzle或字符串buzz。也许有一个默认值。
在捆绑包中,您尝试根据此配置创建对象。您可以使用try catch块来包围它以捕获缺少的依赖项或查看某个类是否可用。如上所述,您不会测试某个文件的存在,而是测试某个具有php函数class_exists
的类。您的测试应该在您真正想要使用的课程上。