我正在使用依赖注入来注入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,
],
]);
}
}
知道我怎么能这样做吗?
由于
答案 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();
});