如果类使用Laravel的容器实现接口,如何提供不同的实现

时间:2017-10-31 10:39:09

标签: laravel laravel-5 guzzle

我正在使用依赖注入来注入Guzzle的HTTP客户端实例。我有几个调用外部服务的数据提供程序类,其中一些需要通过代理进行路由。我有一个在这些类上实现的空接口ConnectViaProxy。我想用代理选项集绑定Guzzle实例,但我不能使用:

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

因为when需要具体的类,而不是接口。

以下是应代理的提供程序示例:

use GuzzleHttp\Client as GuzzleClient;

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

一个不应该被代理的提供者的例子:

use GuzzleHttp\Client as GuzzleClient;

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

这是ProxiedGuzzle类:

use GuzzleHttp\Client as GuzzleClient;

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

知道我怎么能这样做吗?

由于

1 个答案:

答案 0 :(得分:1)

似乎摆脱这种情况的唯一方法是使用父类。

/**
* 
*/
class ViaProxy implements ConnectViaProxy
{

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

然后在您需要的情况下使用它

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

}

如果不是

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

像往常一样使用上下文绑定

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