向控制器提供 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 然后在您的 AppServiceProviders register 方法中添加:

$this->app->singleton('YourHttpClient', function ($app) {
    return new YourHttpClient();
});

那么你应该能够像这样在你的控制器构造函数中输入提示

class SomeController {
    private $client;

    public function __construct(YourHttpClient $client) {
       $this->client = $client;
    }
}