Laravel用に色々ラッパーライブラリ作ったけどなんのためかというとテストしやすさのため。
Guzzleそのまま使うとテストが面倒。
Laravel用に作ってFacade使うとテストしやすい。
でもLaravel7のHTTPクライアントはそれ自体がGuzzleラッパーでテストしやすいので別パッケージとして作らなくてもいい。
(複雑なことをするなら作っていいけど)
https://laravel.com/docs/7.x/http-client
https://readouble.com/laravel/7.x/ja/http-client.html
例としてQiita用を作る
https://github.com/kawax/qiita
ServiceProvider
一番の肝はServiceProvider。AppServiceProviderでもいいしQiitaServiceProviderを作ってもいい。
Macroableで自由に拡張できるのでqiita()
メソッドを作ってトークンとbaseUrlを設定済のHttpクライアントを返す。
use Illuminate\Support\Facades\Http;
use Illuminate\Support\ServiceProvider;
class QiitaServiceProvider extends ServiceProvider
{
public function boot()
{
Http::macro('qiita', function ($token) {
return Http::withToken($token)->baseUrl('https://qiita.com/api/v2/');
});
}
}
PHP7.4ならfn()=>
でもいいけどLaravel7はPHP7.2以上なのでこういう記事ではまだ7.2に合わせるべき。
各自のプロジェクトでは自由。
使い方
トークンは https://github.com/kawax/socialite-qiita を使って取得。
ユーザーの記事一覧
GET /api/v2/authenticated_user/items
Http::qiita()
でトークン設定して後はドキュメント見てメソッドとパスとパラメータを合わせる。
public function __invoke(Request $request)
{
$items = Http::qiita($request->user()->token)
->get(
'authenticated_user/items',
[
'per_page' => 100,
]
)->json();
return view('home')->with(compact('items'));
}
記事を削除
DELETE /api/v2/items/:item_id
public function __invoke(Request $request, string $id)
{
$res = Http::qiita($request->user()->token)
->delete('items/'.$id);
return redirect()->route('home');
}
ちなみに非公開にするにはtitleとbodyが必須っぽいので一旦取得後titleとbodyとprivateを指定して更新すればいい。