Prestashop 赛前狂饮冲突

Prestashop 赛前狂饮冲突,prestashop,guzzle,php,composer,composer-php,prestashop-1.7,Prestashop,Guzzle,Php,Composer,Composer Php,Prestashop 1.7,我正在更新一个模块,包括一个使用6.0的包 Prestashop 1.7使用了Guzzle 5的旧版本 当我在Prestashop上安装插件时,所包含的包的Guzzle版本与Prestashop版本冲突,导致以下错误 未捕获的PHP异常InvalidArgumentException:“魔法请求方法需要URI和可选选项数组”,位于/var/www/html/modules/package/vendorpackage/guzzlehttp/guzzle/src/Client.PHP第81行{“异常

我正在更新一个模块,包括一个使用6.0的包

Prestashop 1.7使用了Guzzle 5的旧版本

当我在Prestashop上安装插件时,所包含的包的Guzzle版本与Prestashop版本冲突,导致以下错误

未捕获的PHP异常InvalidArgumentException:“魔法请求方法需要URI和可选选项数组”,位于/var/www/html/modules/package/vendorpackage/guzzlehttp/guzzle/src/Client.PHP第81行{“异常”:“[object](InvalidArgumentException(代码:0):Magic请求方法需要URI和可选选项数组,位于/var/www/html/modules/package/vendorpackage/guzzlehttp/guzzle/src/Client.php:81)“}[]

我还发现了其他一些类似问题的例子:

基于这些,我对如何回避这个问题有一些想法。这些都不是正确的方法。当然有一个更干净的方法来处理这样的问题吗

  • 从包含的软件包中删除Guzzle-这是最简单的一个,我的问题是,如果我删除此依赖项,它会在哪里停止,怎么说任何其他依赖项以后都不会冲突

  • 可以在包中检查Guzzle的版本,并根据加载的调用交换调用-类似于上面的问题,我可以通过破解来确定我应该使用哪种类型的调用来解决此错误,但我无法判断这可能会引发什么其他问题,并且我的代码可能会在每个版本的语句中乱七八糟

  • 手动更改插件中guzzle的名称空间。因此,我可以进入包的供应商文件夹,强制为包指定一个特定的名称空间,我猜这将解决我的问题,但我失去了安装可重用包的意义

  • 叉口并参考该版本。我可以用叉子叉guzzle并将其作为VCS包包含在插件中。这里的问题是,我必须继续向前推进


问题没有具体说明主要目标是什么。如果您的主要目标是更新Prestashop(而不是解决特定错误),那么我建议您创建Prestashop环境的本地安装,并使用它逐个文件手动更新生产环境。我可以通过以下方式完成:

  • 在本地计算机上以预期版本(1.7.5?)创建新的Prestashop安装(使用新数据库)。Composer将确保两个安装使用相同的依赖项

  • 备份生产数据库,并将其恢复到本地数据库服务器上

  • 重新配置本地Prestashop以与本地数据库对话

  • 升级本地Prestashop。检查此更新的安装是否正常工作

  • 使用diff工具(例如,)将本地安装与远程安装进行比较。两个装置之间的任何差异需要逐个处理:

    • 将新的/更新的代码从本地安装复制到远程安装
    • 从远程安装中删除所有过时的文件
  • 更新生产数据库


  • 记得在开始之前备份软件和数据库。

    最简单的方法是为guzzle选择一个替代软件包,但这可能并不适合您

    • 专业人士
    你节省了很多时间

    • 缺点
    您使用不同的包来做相同的事情

    mediate方法是使用fork-guzzle,然后手动更改名称空间

    • 专业人士
    在普雷斯塔肖普,你什么都不会改变

    如果Prestashop升级到guzzle 6.0,您可以轻松切换到它

    • 缺点
    你必须保持你自己定制的口吻

    最难的方法是给自己打补丁

    • 专业人士
    你得到了你想要的一切

    发送请求,您可能会帮助很多其他人

    • 缺点
    如果Prestashop继续使用guzzlehttp 5.0,那么您最终将陷入修补噩梦

    结论
    如果我必须大口喝,我会选择温和的方式。如果我只想在几行代码中做一些特殊的事情,我会使用另一个包。不您不能按composer安装同一软件包的不同版本。

    简短回答:您无能为力

    长篇大论的回答:考虑到我也处于同样的情况,我找到了解决你问题的办法

    如果您的模块依赖于一个依赖于Guzzle的包,并且该包在您的控制之下,那么您可以使用您的包。它是一个抽象,依赖于其他人,包括一个实际的HTTP客户端库。某人也可能是您,包括的不同实现

    随着时间的推移,由于Prestashop可能也会使用这种方法(与其他平台一起),所有这些平台最终都可能依赖于

    这并不是解决当前问题的真正方法,而是一种长期策略,这也有助于解决当前的问题。

    您可以在模块
    composer.json
    文件中使用
    “guzzlehttp/guzzle”:“~5.0”、
    ,然后使用与使用prestashop相同的版本。

    您有两种解决方案:

    • 查找使用GuzzleHttp 5的软件包版本(如果可用)
    • 找到你的包裹的替代品
    不推荐的解决方案:

    • 要更改包中Guzzle的名称空间,请同时安装Guzzle 6。 (示例:
      使用GuzzleHttp\
      =>
      'use GuzzleHttpSix\\
    发生这种情况的原因是所使用的名称空间存在冲突(guzzle 5和6的名称空间相同)。及