2016-12-30 147 views
3

我正在使用Laravel進行Github API項目。Laravel在哪裏存儲配置的實例邏輯?

我想設置一個已經預先配置的通用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}" 
      ] 
     ]); 
    }); 
} 

我只是覆蓋缺省狂飲客戶與我的預配置的具體實例。這工作得很好,但我遇到的問題是,我不能做以下的控制器:

public function __construct(Container $container) 
{ 
    $guzzle = $container->make(Client::class); 
} 

如果我使用上面的我將只是獲得狂飲的默認實現,而不是我的預配置實例。我猜測這是因爲控制器的構造函數在中間件之前運行,它現在還沒有設置。

我仍然想分享屬性到控制器中的其他方法。我怎麼能解決這個問題?

+0

控制器不應該在中間件之前運行,除非中間件被設計爲在創建響應之後運行。不管怎樣,你都應該把它放到服務提供商那裏。 – user3158900

+0

@ user3158900我需要使用當前登錄的用戶的訪問令牌進行設置。我怎麼能得到服務提供者內部的'Auth :: user()'? –

回答

1

我會爲api交互創建一個新類。在構造函數中,啓動您的guzzle對象,然後爲使用該guzzle對象的各種api調用創建方法。

+0

讓我們來做這件事,我將在哪裏綁定我的類在容器中的具體實現?或者你會跳過容器? –

+0

對不起,我或者不完全明白你的意思,或者我只是不熟悉容器。 –