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