coopbelvedere/laravel-basecamp-api

此包已被废弃且不再维护。未建议替代包。

Basecamp3 API 包装器

v1.5.1 2024-03-14 18:06 UTC

This package is auto-updated.

Last update: 2024-05-22 20:43:13 UTC


README

警告

此仓库现在是只读状态,不再维护。

Basecamp 3 的 API 包装器。

先决条件

创建集成

访问 https://launchpad.37signals.com/integrations 并注册您的应用。

在您的 .env 文件中添加凭据,格式如下

THIRTYSEVENSIGNALS_CLIENT_ID=your_client_id
THIRTYSEVENSIGNALS_CLIENT_SECRET=your_client_secret_key
THIRTYSEVENSIGNALS_REDIRECT_URI=http://localhost/login/basecamp/callback

并将配置变量添加到您的 config/services.php 文件中

    '37signals' => [
        'client_id' => env('THIRTYSEVENSIGNALS_CLIENT_ID'),
        'client_secret' => env('THIRTYSEVENSIGNALS_CLIENT_SECRET'),
        'redirect' => env('THIRTYSEVENSIGNALS_REDIRECT_URI')
    ],

OAuth2

Basecamp3 API 仅支持三重认证,并代表一个用户进行调用。要获取访问令牌,您可以使用 Laravel Socialite37signals Socialite 驱动程序。在保存访问令牌和所需的 Basecamp3 账户后,您现在可以创建 API 包装器的实例。

composer require socialiteproviders/37signals

将 socialite 服务提供者添加到您的 config/app.php 文件的 providers 数组键中

'providers' => [
    ...
    \SocialiteProviders\Manager\ServiceProvider::class,
]

在您的 app/Providers/EventServiceProvider.php 文件的 listen 属性中添加 socialite 事件监听器

protected $listen = [
    ...
    \SocialiteProviders\Manager\SocialiteWasCalled::class => [
        \SocialiteProviders\ThirtySevenSignals\ThirtySevenSignalsExtendSocialite::class.'@handle',
    ],
];

安装

composer require coopbelvedere/laravel-basecamp-api
php artisan vendor:publish --provider="Belvedere\Basecamp\BasecampServiceProvider"

在您的 config/basecamp.php 文件中添加一个 user-agent 以标识您的应用。这是 强制性的,否则任何请求都将返回 400 错误。

用法

获取您的 basecamp id、base uri (href)、token 和刷新 token 并初始化 API 包装器。以下是在 routes/web.php 文件中获取开始的示例。

Route::get('/login/basecamp', function () {
    return Socialite::driver('37signals')->redirect();
});

Route::get('/login/basecamp/callback', function () {
    $user = Socialite::driver('37signals')->user();

    Basecamp::init([
        'id' => $user->user['accounts'][0]['id'],
        'href' => $user->user['accounts'][0]['href'],
        'token' => $user->token,
        'refresh_token' => $user->refreshToken,
    ]);

    $projects = Basecamp::projects();
    dd($projects->index());
});

注意:您不应在回调路由中初始化 API,这只是为了向您展示从 socialite 用户保留的数据。将这些数据保存到数据库中,并/或会话中,以保持连接活跃。

缓存

客户端默认使用 Laravel 文件系统缓存策略。您可以用您首选的 Laravel 缓存存储覆盖它

Basecamp::setCache(Cache::store('redis'));

中间件(可选)

您可以选择将中间件数组添加到 Guzzle 处理器堆栈中。以下是一个用于记录请求的示例

Basecamp::setMiddlewares([
    \GuzzleHttp\Middleware::log(
        Log::getLogger(),
        new \GuzzleHttp\MessageFormatter('{method} {uri} HTTP/{version} {req_body}')
    )
]);

事件监听器

客户端还提供了一个中间件,它将刷新已过期的访问令牌并自动重试目标端点。您可以监听 basecamp.refreshed_token 事件以更新您应用中的访问令牌。事件返回 2 个参数,您的 basecamp 用户 id 和新的访问令牌。

您可以在 EventServiceProvider.php 的 boot 方法中添加如下内容

Event::listen('basecamp.refreshed_token', function ($id, $token) {
    $user = \App\User::where('basecamp_id', $id)->first();
    $user->access_token = $token->access_token;
    $user->expires_at = \Carbon\Carbon::now()->addSeconds($token->expires_in);
    $user->save();
});

分页

Basecamp 中的大多数资源集合都可以分页。

// Get projects.
$projects = Basecamp::projects()->index();

// Get total of projects
$projects->total();

// Save the next page link for your next request
$nextPage = $projects->nextPage();

// Call the next page of projects.
$projects = Basecamp::projects()->index($nextPage);

资源文档

许可证

MIT

版权(c)2017-至今,Coopérative Belvédère Communication