Plugin add http client

Hallo,

ich habe folgendes Problem. Ich benötige in meinem Plugin das Symfony http client Package (HTTP Client (Symfony Docs)).
Habe dies per composer installiert, ist auch in der composer.json und die Dateien sind im vendor Verzeichnis des Plugins vorhanden.
Danach habe ich einen Service in der service.xml angelegt und übergebe den Http-Client als Argument.

src/Resources/config/services.xml

<service id="MyDemo\Service\BasicConfigService" public="true">
    <argument type="service" id="Symfony\Contracts\HttpClient\HttpClientInterface" />
</service>

src/Service/BasicConfigService.php

<?php
namespace MyDemo\Service;

use Symfony\Contracts\HttpClient\HttpClientInterface;

class BasicConfigService
{
    protected $client;

    public function __construct(HttpClientInterface $client = null)
    {
        $this->httpClient = $client;
    }

}

Nachdem ich alle Caches geleert und das Plugin aktualisiert habe bekommen ich den Fehler:

`The service "MyDemo\Service\BasicConfigService" has a dependency on a non-existent service "Symfony\Contracts\HttpClient\HttpClientInterface".`

Jemand eine Idee was ich falsch mache?

Vielen Dank für eure Hilfe

use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Psr7\Request;

...

    public function __construct()
    {
        $this->client = new Client([
            'timeout' => 120,
            'allow_redirects' => false,
        ]);
        $this->context = Context::createDefaultContext();
    }

Mit Guzzle Http Client habe ich die Probleme nicht, mich würde trotzdem interessieren, wie man einen Symfony-Service richtig in ein Plugin integriert. Meine Schritte:

  1. Pakete über composer installiert im Plugin Verzeichnis (composer.json & composer.lock und vendor Verzeichnis passen)
  2. autoload.php in Plugin.php inkludiert
if (file_exists(dirname(__DIR__) . '/vendor/autoload.php')) {
    require_once dirname(__DIR__) . '/vendor/autoload.php';
}
  1. Service als Argument in der services.xml

Wenn ich die oben genannten Schritte mache, dann den Cache leere, kann ich das Frontend laden, jedoch kommt in der Konsole beim Ausführen von bin/console folgender Fehler:

Error: Cannot declare interface Symfony\Contracts\Service\ResetInterface, because the name is already in use

Wenn ich aber nach dem Cache leeren zuerst bin/console ausführe, funktioniert dieser, dann kommt der oben genannte Error beim Aufrufen des Frontends :roll_eyes:

Autoload würde ich über die composer.json machen

{
    "autoload": {
        "psr-4": {
            "League\\OAuth2\\Client\\": "vendor/league/oauth2-client/src/",
            "Firebase\\JWT\\": "vendor/firebase/php-jwt/src/",
            "MeinSw6Plugin\\": "src/"
        }
    }
}

Und ein Interface ist kein Service, ein Interface sagt nur aus welche Grundstruktur eine Class hat. Also eine Validierung. Du musst den HttpClient entweder Standalone bauen

use Symfony\Component\HttpClient\HttpClient;

$client = HttpClient::create();
$response = $client->request('GET', 'https://api.github.com/repos/symfony/symfony-docs');

oder eine Konfiguration hinterlegen

# config/packages/framework.yaml
framework:
    http_client:
        max_host_connections: 10
        # ...

Für meine Bedürfnisse reichte der Guzzle Client bisher immer aus.

Ok, vielen Dank für die Hilfe und die Aufklärung.