如何制作带有可选依赖项的Symfony 2捆绑包?

如何制作带有可选依赖项的Symfony 2捆绑包?,symfony,symfony-2.1,composer-php,Symfony,Symfony 2.1,Composer Php,假设您的包使用了一些RESTful服务,可以与两个不同的PHP HTTP客户机一起工作:以及。因为它使用适配器和接口 如何将此依赖项定义为可选的?您会这样做吗,例如在编译器过程中 如果(!is_文件('/path/to/guzzle')&&!is_文件('/path/to/buzz')){ 抛出new\RuntimeException('您需要安装guzzle或Buzz浏览器'); } 这是为bundle定义可选依赖项的正确方法吗?首先,您不会像上面那样执行此操作,主要是因为检查文件是否存在于

假设您的包使用了一些RESTful服务,可以与两个不同的PHP HTTP客户机一起工作:以及。因为它使用适配器和接口

如何将此依赖项定义为可选的?您会这样做吗,例如在编译器过程中

如果(!is_文件('/path/to/guzzle')&&!is_文件('/path/to/buzz')){
抛出new\RuntimeException('您需要安装guzzle或Buzz浏览器');
}

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

首先,您不会像上面那样执行此操作,主要是因为检查文件是否存在于某个路径无法工作。如果用户将它们安装到其他地方(无论出于何种原因),并设法正确使用名称空间,该怎么办

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

还有其他问题,比如用户必须自己管理依赖关系。有时候值得,有时候不值得

现在,如果您决定让用户选择,我会选择一个配置选项,用户可以传递字符串guzzle或字符串buzz。可能有一个默认值


在包中,您尝试根据此配置创建对象。您可以使用try-catch块来捕获缺少的依赖项,或者查看某个类是否可用。如前所述,您不会测试某个文件是否存在,而是使用php函数
class\u exists
测试某个类是否存在。你的测试应该针对你真正想要使用的一个或多个类。

我想强调一下,对于这个选择的有用性问题。如果没有HTTP客户端,您的模块可能无法工作,因此这两个依赖项都不是可选的。您至少需要解决一个依赖项。谢谢。正如@Sven所建议的,捆绑包至少需要一个依赖项。如果你在这方面想得更好,为什么你会强迫用户安装——比如guzzle——如果他已经安装了buzz,并且捆绑包可以与后者一起使用呢?无论如何,我会选择配置方式,传递服务(浏览器)并使用instanceof operator检查。您的库显然不支持我选择的HTTP客户端,因此我必须安装您的任何依赖项。应该是哪一个,为什么?我不会扩展你的库来使用我的,我也不会进入研究模式去了解你推荐的客户中哪一个更好。我甚至可能不会被你的图书馆为什么喜欢一个客户而不是另一个客户的细节所困扰。但我仍然有一个选择,这不是开箱即用的。一句话:我现在质疑用户选择的有用性,但讨论它意味着讨论你的图书馆的设计决策。@Sven有趣的一点。你认为让用户选择http客户端是无用的吗?我认为用户无法决定哪种可能的替代方案“更好”。要么他对使用他已经使用过的方法感到惊讶,但问题仍然是其他方法是否会更好。作为图书馆供应商,您应该知道哪个客户机更好。除非PHP库就常见任务的通用接口达成一致,并因此使Composer选项定义对虚拟“http客户端”包的依赖关系变得实际有用,否则用户无法做出明智的选择——因此,是的,此功能实际上是无用的。