LaravelのHTTPクライアントでcookieを利用する

LaravelではHTTPクライアントとしてGuzzleをラップしたクラスを提供しています。
cookieを利用した通信方法がドキュメントになかったので確認をしました。

ライブラリのバージョン

確認をしたライブラリのバージョンは下記の通り。
・laravel/framework:11.18.1
・guzzlehttp/guzzle:7.9.2

Guzzleの仕様確認

Guzzleのドキュメントを確認すると下記の記述があります。
https://docs.guzzlephp.org/en/stable/quickstart.html#cookies

You can set cookies to true in a client constructor if you would like to use a shared cookie jar for all requests.

コンストラクタでオプションを指定し、クライアントを再利用することでcookieが利用できそうです。

Laravelの実装確認

LaravelのHTTPクラス内でのクライアントの扱いについて確認します。
実装があるのはIlluminate\Http\Client\PendingRequestです。

buildClientでクライアントを取得しますが、メンバ変数clientにインスタンスが存在する場合は再利用されます。
createClientではGuzzleHttp\Clientをインスタンス化する際に、cookiestrueにしています。

PendingRequest#buildClient
public function buildClient()
{
    return $this->client ?? $this->createClient($this->buildHandlerStack());
}
PendingRequest#createClient
public function createClient($handlerStack)
{
    return new Client([
        'handler' => $handlerStack,
        'cookies' => true,
    ]);
}

https://github.com/laravel/framework/blob/v11.18.1/src/Illuminate/Http/Client/PendingRequest.php

実装

ということで、クライアントを先に生成し、リクエストの際にsetClientを行ったサンプルは下記のようになります。
WordPressにログインし、投稿一覧ページのHMTLを取得しています。

PHP
public function __invoke__()
{
    $client = Http::buildClient();

    $response = Http::setClient($client)
        ->asForm()
        ->post('https://example.jp/wp-login.php', [
            'log' => 'user',
            'pwd' => 'password',
        ]);

    if (strpos($response->body(), '入力内容を確認の上、もう一度送信してください。') !== FALSE) {
        return 'ログインエラー';
    }

    $response = Http::setClient($client)
        ->get('https://example.jp/wp-admin/edit.php');

    if (!$response->successful()) {
        return '取得エラー';
    }

    dd($response->body());
}