Installation
composer require httpsoft/http-cookie
Requires PSR-7 HTTP message interfaces (e.g., zendframework/zend-diactoros or slim/psr7).
First Use Case: Setting a Cookie
use HttpSoft\Cookie\Cookie;
use HttpSoft\Cookie\CookieJar;
$cookie = new Cookie('user_token', 'abc123', 3600, '/', 'example.com', true, true);
$jar = new CookieJar();
$jar->setCookie($cookie);
Where to Look First
Cookie Management in Middleware
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
class CookieMiddleware implements MiddlewareInterface {
public function process(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface {
$jar = new CookieJar();
$jar->loadFromRequest($request); // Parse cookies from request
$response = $jar->applyToResponse($response); // Apply cookies to response
return $response;
}
}
Laravel Integration (Request/Response)
// In a Laravel service provider or middleware:
$jar = new CookieJar();
$jar->loadFromRequest($request); // Parse cookies from Laravel's `Request` object
$response = $jar->applyToResponse($response); // Apply cookies to Laravel's `Response` object
Cookie Serialization
$cookie = new Cookie('prefs', json_encode(['theme' => 'dark']), 86400);
$jar->setCookie($cookie);
Illuminate\Http\Request/Response by wrapping CookieJar in a trait or facade.CookieJar for unit tests by injecting it into services.Domain/Path Mismatch
example.com won’t work on sub.example.com unless explicitly allowed.setDomain('.example.com') for subdomains.Secure/HTTP-Only Flags
secure: true on HTTPS sites or httponly: true for security risks.$cookie = new Cookie('session', $value, 0, '/', 'example.com', true, true);
PSR-7 Message Quirks
zend-diactoros) require explicit cookie header parsing.CookieJar::loadFromRequest() to avoid manual parsing.Cookie Not Setting?
Set-Cookie headers in browser dev tools or curl -v.Domain/Path match the request URL.Cookie Overwriting
CookieJar merges cookies; explicit setCookie() overwrites.addCookie() to append instead of replace.Custom Cookie Classes
Extend HttpSoft\Cookie\Cookie to add metadata (e.g., SameSite attributes):
class ExtendedCookie extends Cookie {
public function __construct(...$args) {
parent::__construct(...$args);
$this->setSameSite('Strict'); // Not in base class
}
}
Middleware Decorators
Wrap CookieJar in middleware to add logic (e.g., auto-expiry for guest users):
$jar = new CookieJar();
$jar->setCookie(new Cookie('guest', 'true', 300)); // 5-minute expiry
Laravel Facade
Create a facade for CookieJar to integrate seamlessly:
// app/Facades/Cookie.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Cookie extends Facade {
protected static function getFacadeAccessor() { return 'cookie.jar'; }
}
How can I help you explore Laravel packages today?