【问题标题】:Laravel where to store configured instance logic?Laravel 在哪里存储配置的实例逻辑?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 让我最终这样做,我将在容器中绑定我的类的具体实现?还是直接跳过容器?
  • 抱歉,我要么没完全理解你的意思,要么就是不熟悉容器。
猜你喜欢
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 2011-09-08
相关资源
最近更新 更多