Laravel在哪里存储配置的实例逻辑?

时间:2016-12-30 18:17:50

标签: php laravel oop containers laravel-5.3

我正在使用Laravel进行Github API项目。

我想设置一个已预先配置的通用Guzzle客户端实例。我需要这个,因为我的Guzzle请求大约有90%,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的默认实现,而不是我预先配置的实例。我猜它是因为控制器的构造函数在中间件之前运行而且它还没有设置好。

我仍然希望将属性共享给控制器中的其他方法。我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:1)

我会为api交互创建一个新类。在构造函数中,启动guzzle对象,然后为使用该guzzle对象的各种api调用创建方法。