DeepLcom / deepl-php

Official PHP library for the DeepL language translation API.
MIT License
207 stars 22 forks source link

BUG: Class Http\Discovery\Psr17FactoryDiscovery not found error #27

Closed diderich closed 1 year ago

diderich commented 1 year ago

After updating the package deeplcom/deepl-php to the latest version [1.5.0 according to VERSION] by running composer update today (27.06.2023) and having to add the pugin php-http/discovery to my allow-plugins list, I receive the following error message:

[27-Jun-2023 10:03:06 Europe/Zurich] PHP Fatal error:  Uncaught Error: Class "Http\Discovery\Psr17FactoryDiscovery" not found in /photos/holiday/vendor/deeplcom/deepl-php/src/HttpClientWrapper.php:66
Stack trace:
#0 /photos/holiday/vendor/deeplcom/deepl-php/src/Translator.php(75): DeepL\HttpClientWrapper->__construct()
#1 /photos/holiday/lib3/class.Translate.php(26): DeepL\Translator->__construct()
#2 /photos/holiday/web3/holiday.php(47): Translate->__construct()
#3 {main}
  thrown in /photos/holiday/vendor/deeplcom/deepl-php/src/HttpClientWrapper.php on line 66
JanEbbing commented 1 year ago

It seems autoloading is not working correctly. Could you please share your composer.json file (and how you set up autoloading, e.g. require __DIR__ . '/../vendor/autoload.php'; at the start of your entrypoint script)? I can't reproduce this on a new sample project: Running composer init, defining deeplcom/deepl-php:1.5.0 as a dependency and setting up autoload, gives me the following composer.json:

{
    "name": "sample/phptest",
    "type": "project",
    "require": {
        "deeplcom/deepl-php": "1.5.0",
        "symfony/http-client": "^6.3",
        "nyholm/psr7": "^1.8"
    },
    "license": "GPL",
    "authors": [
        {
            "name": "Jan Ebbing",
            "email": "my email"
        }
    ],
    "config": {
        "allow-plugins": {
            "php-http/discovery": true
        }
    }
}

And in this project I can just create a new \DeepL\Translator in src/Script.php:

<?php

require __DIR__ . '/../vendor/autoload.php';

$t = new \DeepL\Translator('my_auth_key');
var_dump($t);

Edit: I just checked, I also can't reproduce by starting with v1.4.0 of the package and then running composer update to get to v1.5.0, the autoloading is updated correctly, so I suspect your autoload isn't set up correctly.

diderich commented 1 year ago

In previous version require __DIR__ . '/../vendor/autoload.php' was not necessary (having a loader load anything under DeepL\ was sufficient). I added the generic autoload statement and now it works fine (again).

Thanks for your help @JanEbbing.