向控制器提供 API-客户端
Provide API-Client to Controller
我正在使用 Laravel 调用外部 API。
这是我的客户:
<?php
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST',
'https://example.org/oauth/token', [
'headers' => [
'cache-control' => 'no-cache',
'Content-Type' => 'application/x-www-form-urlencoded',
],
'form_params' => [
'client_id' => '2',
'client_secret' => 'client-secret',
'grant_type' => 'password',
'username' => 'username',
'password' => 'password',
],
]);
$accessToken = json_decode((string)$response->getBody(),
true)['access_token'];
现在我可以用它来取东西了:
<?php
$response = $client->request('GET',
'https://example.org/api/items/index', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
所以现在我不想在每个方法上再次启动客户端。所以也许有一种 cool/Laravel-like 方法可以在特定路线上向控制器提供 $client
?
我考虑过应用服务提供商或中间件,但我很想看一个例子:-)
也许你可以使用 singleton
?将您的实现包装在 class 让我们说 YourHttpClient
然后在您的 AppServiceProvider
s register
方法中添加:
$this->app->singleton('YourHttpClient', function ($app) {
return new YourHttpClient();
});
那么你应该能够像这样在你的控制器构造函数中输入提示
class SomeController {
private $client;
public function __construct(YourHttpClient $client) {
$this->client = $client;
}
}
我正在使用 Laravel 调用外部 API。
这是我的客户:
<?php
use GuzzleHttp\Client;
$client = new Client();
$response = $client->request('POST',
'https://example.org/oauth/token', [
'headers' => [
'cache-control' => 'no-cache',
'Content-Type' => 'application/x-www-form-urlencoded',
],
'form_params' => [
'client_id' => '2',
'client_secret' => 'client-secret',
'grant_type' => 'password',
'username' => 'username',
'password' => 'password',
],
]);
$accessToken = json_decode((string)$response->getBody(),
true)['access_token'];
现在我可以用它来取东西了:
<?php
$response = $client->request('GET',
'https://example.org/api/items/index', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
所以现在我不想在每个方法上再次启动客户端。所以也许有一种 cool/Laravel-like 方法可以在特定路线上向控制器提供 $client
?
我考虑过应用服务提供商或中间件,但我很想看一个例子:-)
也许你可以使用 singleton
?将您的实现包装在 class 让我们说 YourHttpClient
然后在您的 AppServiceProvider
s register
方法中添加:
$this->app->singleton('YourHttpClient', function ($app) {
return new YourHttpClient();
});
那么你应该能够像这样在你的控制器构造函数中输入提示
class SomeController {
private $client;
public function __construct(YourHttpClient $client) {
$this->client = $client;
}
}