delight-im/cookie

PHP的现代cookie管理

v3.4.0 2020-04-16 11:01 UTC

This package is auto-updated.

Last update: 2024-08-24 07:08:53 UTC


README

PHP的现代cookie管理

需求

  • PHP 5.4.0+

安装

  1. 通过Composer包含库 [?]

    $ composer require delight-im/cookie
    
  2. 包含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.namesession.cookie_lifetimesession.cookie_pathsession.cookie_domainsession.cookie_securesession.cookie_httponlysession.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 许可协议 的条款。