Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prestashop Guzzle Conflict

I am updating a prestashop module by including a package that uses guzzle6.0.

Prestashop 1.7 uses an older version of Guzzle 5.

When I install the plugin on Prestashop the included package's version of Guzzle conflicts with the Prestashop one resulting in the following php error.

Uncaught PHP Exception InvalidArgumentException: "Magic request methods require a URI and optional options array" at /var/www/html/modules/package/vendorpackage/guzzlehttp/guzzle/src/Client.php line 81 {"exception":"[object] (InvalidArgumentException(code: 0):Magic request methods require a URI and optional options array at /var/www/html/modules/package/vendorpackage/guzzlehttp/guzzle/src/Client.php:81)"} []

I have found a few other examples of similar issues:

  • PrestaShop module classes not found (namespaces)
  • http://forge.prestashop.com/browse/BOOM-2427
  • Prestashop 1.6, conflict: 2 different modules requiring same class, different versions
  • https://github.com/Nexmo/nexmo-php/issues/77

Based on these I have a few ideas for how to get around the issue. None of these feel like the right way to do it. Surely there is a cleaner way to handle issues like this with composer?

  • Remove Guzzle from the included package - this is the simplest one, my problem with this is that if I remove this dependency where does it stop, whats to say any other dependencies wont clash later down the line that cant be removed?

  • Can check version of Guzzle in package and swap calls dependent on which one loads - similarly to the issue above I can hack a fix in to determine which type of call I should be using for this bug, but I cant tell what other issues this may raise and my code may end up littered with statements for each version.

  • Manually Change the namespaces of guzzle in the plugin. So I can go into the vendor folder of my package and force a specific namespace for the package, I am guessing this will solve my issue, but I am losing the point of installing a re-usable package.

  • Fork Guzzle and refer to that version. I could fork guzzle and include it as a VCS package in the plugin. Issue here being that I then have to keep that maintained moving forward.

like image 666
Jonny C Avatar asked Dec 18 '18 10:12

Jonny C


1 Answers

The easiest way is to choose an alternative package for guzzle, but this might not be best for you.

  • Pros

You save a lot of time

  • Cons

You use different package to do the same thing.

The moderate way is to fork guzzle, and then you manually change the namespaces.

  • Pros

You don't change anything in Prestashop.

If Prestashop upgraded to guzzle 6.0, you could easily switch to it.

  • Cons

You have to maintain your own customized guzzle.

The hardest way is to patch Prestashop yourself

  • Pros

You get everything you want.

Send a pull request, you might help a lot of others.

  • Cons

If Prestashop kept using guzzlehttp 5.0, you end up in a patching nightmare.

Conclusions

I would choose the moderate way if I must use guzzle. If I just wanted to do something special in a few lines of code, I would just use an alternative package. And NO you cannot install different versions of the same package by composer.

like image 62
cwhsu Avatar answered Nov 04 '22 17:11

cwhsu