【发布时间】:2016-12-30 18:17:49
【问题描述】:
我正在将 Laravel 用于 Github API 项目。
我想设置一个已预先配置的通用 Guzzle 客户端实例。我需要这个,因为在我大约 90% 的 Guzzle 请求中,Guzzle 客户端需要一个 access_token 标头和一个 base_uri。
// Return a new configured guzzle client.
return new Client([
'base_uri' => 'https://api.github.com',
'headers' => [
'Authorization' => "token {$access_token}"
]
]);
我知道我可以将它绑定到我目前正在这样做的容器中,就像在自定义中间件中一样:
if (Auth::check()) {
$this->app->singleton(Client::class, function() {
// Grab the current user.
$user = Auth::user();
$access_token = decrypt($user->access_token);
// Return a new configured Guzzle instance.
return new Client([
'base_uri' => 'https://api.github.com',
'headers' => [
'Authorization' => "token {$access_token}"
]
]);
});
}
我只是用我预先配置的具体实例覆盖了默认的 Guzzle 客户端。这工作正常,但我遇到的问题是我无法在控制器中执行以下操作:
public function __construct(Container $container)
{
$guzzle = $container->make(Client::class);
}
如果我使用上面的方法,我只会得到 Guzzle 的默认实现,而不是我的预配置实例。我猜这是因为控制器的构造函数在中间件之前运行,而且它还没有设置。
不过,我仍然想将该属性共享给控制器中的其他方法。我该如何解决这个问题?
【问题讨论】:
-
控制器不应该在中间件之前运行,除非中间件被设计为在响应创建之后运行。不过,无论哪种情况,您都应该将其放入服务提供商中。
-
@user3158900 我需要使用当前登录用户的访问令牌进行设置。我怎样才能在服务提供商内部获得
Auth::user()?
标签: php laravel oop containers laravel-5.3