2017-10-31 2 views
0

Ich verwende Dependency-Injection, um Instanzen von Guzzles HTTP-Client zu injizieren. Ich habe mehrere Datenprovider-Klassen, die externe Dienste aufrufen, von denen einige über Proxies geroutet werden müssen. Ich habe eine leere Schnittstelle ConnectViaProxy, die für diese Klassen implementiert ist. Ich mag eine Guzzle Instanz mit dem Proxy-Option Set binden, aber ich kann nicht verwenden:Wie kann ich eine andere Implementierung bereitstellen, wenn die Klasse eine Schnittstelle implementiert, die den Laravel-Container verwendet?

$this->app->when(ConnectViaProxy::class) 
    ->needs(GuzzleClient::class) 
    ->give(function(): ProxiedGuzzle { 
     return new ProxiedGuzzle(); 
    }); 

Da when eine konkrete Klasse erfordert, keine Schnittstelle. Hier

ist ein Beispiel für einen Anbieter, die Proxy-Klasse zugänglich werden soll:

use GuzzleHttp\Client as GuzzleClient; 

class FooProvider implements Provider, ConnectViaProxy 
{ 
    public function __construct(GuzzleClient $client) 
    { 
     // Should be an instance of ProxiedGuzzle 
     dd($client); 
    } 
} 

Und ein Beispiel für einen Anbieter, der nicht über einen Proxy werden soll:

use GuzzleHttp\Client as GuzzleClient; 

class BarProvider implements Provider 
{ 
    public function __construct(GuzzleClient $client) 
    { 
     // Should be an instance of GuzzleClient 
     dd($client); 
    } 
} 

Und hier ist die ProxiedGuzzle Klasse:

use GuzzleHttp\Client as GuzzleClient; 

class ProxiedGuzzle extends GuzzleClient 
{ 
    public function __construct() 
    { 
     parent::__construct([ 
      'proxy' => [ 
       'http' => PROXY_IP, 
       'https' => PROXY_IP, 
      ], 
     ]); 
    } 
} 

Irgendeine Idee, wie ich das tun könnte?

Dank

Antwort

1

Es scheint, dass der einzige Weg aus dieser Situation ist Elternklasse zu verwenden.

/** 
* 
*/ 
class ViaProxy implements ConnectViaProxy 
{ 

    public function __construct(GuzzleClient $client) 
    { 
     // Should be an instance of ProxiedGuzzle 
     dd($client); 
    } 
} 

Dann nutzen Sie es nur in den Fällen, die Sie benötigen

/** 
* 
*/ 
class FooProvider extends ViaProxy implements Provider 
{ 

} 

Und wenn nicht, nicht

use GuzzleHttp\Client as GuzzleClient; 
/** 
* 
*/ 
class BarProvider implements Provider 
{ 
    public function __construct(GuzzleClient $client) 
    { 
     // Should be an instance of GuzzleClient 
     dd($client); 
    } 

Verwendung kontextuellen Bindung wie üblich

$this->app->when(ViaProxy::class) 
    ->needs(GuzzleClient::class) 
    ->give(function(): ProxiedGuzzle { 
     return new ProxiedGuzzle(); 
    }); 
Verwandte Themen