delight-im / cookie
PHP的现代cookie管理
Requires
- php: >=5.4.0
- delight-im/http: ^2.0
README
PHP的现代cookie管理
需求
- PHP 5.4.0+
安装
-
通过Composer包含库 [?]
$ composer require delight-im/cookie
-
包含Composer自动加载器
require __DIR__ . '/vendor/autoload.php';
升级
从该项目的早期版本迁移?请参阅我们的升级指南以获取帮助。
用法
静态方法
此库提供了一个静态方法,该方法与PHP内置的setcookie(...)
函数兼容,但包括对诸如SameSite
属性等较新功能的支持
\Delight\Cookie\Cookie::setcookie('SID', '31d4d96e407aad42'); // or \Delight\Cookie\Cookie::setcookie('SID', '31d4d96e407aad42', time() + 3600, '/~rasmus/', 'example.com', true, true, 'Lax');
构建者模式
Cookie
类的实例允许您通过设置单个属性方便地构建cookie。此类使用合理的默认值,可能与setcookie
函数的默认值不同。
$cookie = new \Delight\Cookie\Cookie('SID'); $cookie->setValue('31d4d96e407aad42'); $cookie->setMaxAge(60 * 60 * 24); // $cookie->setExpiryTime(time() + 60 * 60 * 24); $cookie->setPath('/~rasmus/'); $cookie->setDomain('example.com'); $cookie->setHttpOnly(true); $cookie->setSecureOnly(true); $cookie->setSameSiteRestriction('Strict'); // echo $cookie; // or $cookie->save(); // or // $cookie->saveAndSet();
方法调用也可以链式调用
(new \Delight\Cookie\Cookie('SID'))->setValue('31d4d96e407aad42')->setMaxAge(60 * 60 * 24)->setSameSiteRestriction('None')->save();
稍后可以像这样简单地删除cookie
$cookie->delete(); // or $cookie->deleteAndUnset();
注意:要使删除有效,cookie必须与最初保存的cookie具有相同的设置——除了其值,不需要设置。因此,您应该记得再次传递适当的值给setPath(...)
、setDomain(...)
、setHttpOnly(...)
和setSecureOnly(...)
。
读取cookie
-
检查cookie是否存在
\Delight\Cookie\Cookie::exists('first_visit');
-
读取cookie的值(可选默认值)
\Delight\Cookie\Cookie::get('first_visit'); // or \Delight\Cookie\Cookie::get('first_visit', \time());
管理会话
使用Session
类,您可以通过与PHP内置的session_start()
函数兼容的方式启动和恢复会话,同时也可以使用此库提供的改进的cookie处理
// start session and have session cookie with 'lax' same-site restriction \Delight\Cookie\Session::start(); // or \Delight\Cookie\Session::start('Lax'); // start session and have session cookie with 'strict' same-site restriction \Delight\Cookie\Session::start('Strict'); // start session and have session cookie without any same-site restriction \Delight\Cookie\Session::start(null); // or \Delight\Cookie\Session::start('None'); // Chrome 80+
所有三个调用都尊重PHP的session_set_cookie_params(...)
函数的设置以及配置选项session.name
、session.cookie_lifetime
、session.cookie_path
、session.cookie_domain
、session.cookie_secure
、session.cookie_httponly
和session.use_cookies
。
同样,也通过
session_regenerate_id(); // and session_regenerate_id(true);
提供
\Delight\Cookie\Session::regenerate(); // and \Delight\Cookie\Session::regenerate(true);
如果您想防止由于改进的cookie处理带来的会话固定攻击。
此外,通过
\Delight\Cookie\Session::id();
提供对当前内部会话ID的访问,作为
session_id();
读取和写入会话数据的替代
-
从会话中读取值(可选默认值)
$value = \Delight\Cookie\Session::get($key); // or $value = \Delight\Cookie\Session::get($key, $defaultValue);
-
向会话中写入值
\Delight\Cookie\Session::set($key, $value);
-
检查会话中是否存在值
if (\Delight\Cookie\Session::has($key)) { // ... }
-
从会话中删除值
\Delight\Cookie\Session::delete($key);
-
读取 然后 立即从会话中删除值
$value = \Delight\Cookie\Session::take($key); $value = \Delight\Cookie\Session::take($key, $defaultValue);
这对于闪存消息非常有用,例如与
has(...)
方法结合使用。
解析cookie
$cookieHeader = 'Set-Cookie: test=php.net; expires=Thu, 09-Jun-2016 16:30:32 GMT; Max-Age=3600; path=/~rasmus/; secure'; $cookieInstance = \Delight\Cookie\Cookie::parse($cookieHeader);
规范
贡献
所有贡献都受欢迎!如果您想贡献,请首先创建一个问题,以便您的功能、问题或问题可以讨论。
许可
本项目遵循 MIT 许可协议 的条款。