weijiajia/saloonphp-header-synchronize-plugin

A Saloon PHP plugin for synchronizing headers between requests to maintain session state and authentication

dev-main 2025-03-08 16:01 UTC

This package is auto-updated.

Last update: 2025-03-08 16:03:24 UTC


README

中文文档 | English

Latest Version on Packagist Total Downloads

A plugin for Saloon PHP that synchronizes headers between requests, useful for maintaining session state, authentication tokens, and other persistent headers across multiple API requests.

Features

  • Seamless header synchronization between requests
  • Multiple storage drivers (Array, File, PSR-16 Cache)
  • Easy integration with Saloon HTTP clients
  • Configurable header sync for specific HTTP methods
  • Minimal setup required

Installation

You can install the package via composer:

composer require weijiajia/saloonphp-header-synchronize-plugin

Usage

Basic Usage

  1. Implement the HeaderSynchronize interface on your connector or request class:
use Saloon\Http\Connector;
use Weijiajia\SaloonphpHeaderSynchronizePlugin\Contracts\HeaderSynchronize;
use Weijiajia\SaloonphpHeaderSynchronizePlugin\HasHeaderSynchronize;
use Saloon\Repositories\ArrayStore;
use Weijiajia\SaloonphpHeaderSynchronizePlugin\Contracts\HeaderSynchronizeDriver;

class ApiConnector extends Connector implements HeaderSynchronize
{
    use HasHeaderSynchronize;
    
    // Define headers you want to synchronize between requests
    protected function defaultHeaderSynchronizes(): array
    {
        return [
            'Authorization',
            'Session-Token',
            // Other headers you want to persist
        ];
    }
    
    // Optionally specify which HTTP methods should use header synchronization
    protected function getHeaderSynchronizeMethods(): array
    {
        return [
            Method::GET,
            Method::POST,
            // Other methods
        ];
    }
}

Storage Drivers

Array Storage (Default)

The default driver uses in-memory array storage for the duration of the PHP execution:

// Already used by default, but you can explicitly define it:
$connector = new ApiConnector();
$connector->withHeaderSynchronizeDriver(new ArrayStoreHeaderSynchronize());

File Storage

For persisting headers between requests across different script executions:

use Weijiajia\SaloonphpHeaderSynchronizePlugin\Driver\FileHeaderSynchronize;

$connector = new ApiConnector();
$connector->withHeaderSynchronizeDriver(
    new FileHeaderSynchronize('/path/to/headers.json')
);

PSR-16 Cache Storage

Use any PSR-16 compatible cache library:

use Weijiajia\SaloonphpHeaderSynchronizePlugin\Driver\CacheHeaderSynchronize;

$connector = new ApiConnector();
$connector->withHeaderSynchronizeDriver(
    new CacheHeaderSynchronize(
        $cacheImplementation, // Any PSR-16 CacheInterface implementation
        'api_headers',        // Cache key
        [],                   // Default data
        3600                  // TTL in seconds
    )
);

Usage Example

$connector = new ApiConnector();

// First request (e.g., login)
$response = $connector->send(new LoginRequest($credentials));
// Headers like 'Authorization' are automatically captured

// Subsequent requests will include synchronized headers automatically
$profileResponse = $connector->send(new GetProfileRequest());
// The 'Authorization' header was automatically included

Creating Custom Drivers

You can create custom header synchronization drivers by implementing the HeaderSynchronizeDriver interface:

use Weijiajia\SaloonphpHeaderSynchronizePlugin\Contracts\HeaderSynchronizeDriver;
use Saloon\Http\Response;
use Saloon\Http\PendingRequest;
use Saloon\Repositories\ArrayStore;

class CustomHeaderSynchronize implements HeaderSynchronizeDriver
{
    public function extractHeader(Response $response): Response
    {
        // Logic to extract and store headers from responses
        return $response;
    }

    public function withHeader(PendingRequest $pendingRequest, ArrayStore $persistentHeaders): PendingRequest
    {
        // Logic to add stored headers to pending requests
        return $pendingRequest;
    }
}

License

The MIT License (MIT). Please see License File for more information.