stefna/cookie

psr7/psr15 的 Cookie 管理

1.0.0 2023-10-25 11:55 UTC

This package is auto-updated.

Last update: 2024-08-25 14:20:03 UTC


README

Build Status Latest Version on Packagist Software License

此包帮助在 PSR-7/PSR-15 环境中处理 HTTP Cookie。

要求

PHP 8.2 或更高版本。

安装

composer require stefna/cookie

动机

当使用 PSR-7 时,当您希望请求-响应循环中的所有内容都位于请求和响应对象中时,setcookie() 函数变得无用了。

setcookie() 也不太可能支持 http Cookie 标准的最新功能。

概念

该包的主要概念是将 cookie 的读写与使用 cookie 分离,因此考虑到这一点,CookieJar 并未连接到 http 层,它只是一个存储 cookie 的容器。

然后由 CookieMiddlewareCookieManager 来读取和写入 http 头部。

通过这种方式分离,很容易实现对 cookie 的签名或加密,因为它们不是使用 cookie 的代码的一部分。

这也意味着在创建新的 cookie 时,您不需要 Response 对象。您只需将 cookie 添加到 CookieJar 中,中间件就会处理写入 cookie。

用法

从动作内部使用 cookie jar。

CookieJarCookieMiddleware 添加到请求中,该中间件还负责将 cookie 添加到响应头中。

use Psr\Http\Message\ServerRequestInterface;

class Action
{
	public function __invoke(ServerRequestInterface $request)
	{
		$cookieJar = $request->getAttribute(\Stefna\Cookie\CookieJar::class);

		if (!$cookieJar->has('visits')) {
			$cookieJar->set(new \Stefna\Cookie\Cookie('visits', 0));
		}
		$visitCookie = $cookieJar->get('visits');
		if ($cookieJar->getInt('visits') < 10) {
			$cookieJar->set($visitCookie
				->withValue($cookieJar->getInt('visits') + 1)
				->withExpires(DateInterval::createFromDateString('+1 week'))
			);
		}
		else {
			// remove cookie alt 1
			$cookieJar->set($visitCookie->expire());
			// remove cookie alt 2
			$cookieJar->remove($visitCookie);
		}
	}
}

贡献

我们始终欢迎收到错误/安全报告和错误/安全修复。

许可协议

MIT 许可协议 (MIT)。请参阅 许可文件 了解更多信息。