ujjwal/psr7-http-session

PSR-7 的 PHP 原生会话处理程序的替代方案

1.0.0 2017-08-05 06:23 UTC

This package is auto-updated.

Last update: 2024-09-13 14:37:09 UTC


README

Build Status Coverage Status Latest Stable Version Total Downloads Latest Unstable Version License

PHP 原生会话处理程序的替代方案。它不依赖于 PHP 的会话功能。它可以与像 react/http 这样的非典型基于 PHP 的应用程序一起使用。

但是,为什么?

But, why?

  • 您不必依赖于 session_ 函数,这意味着您可以编写可测试的代码。
  • 您不必依赖于 $_SESSION 超全局变量,这使得您可以编写更可测试的代码。
  • 您甚至可以使用它来处理非典型基于 PHP 的应用程序,如与 react/http 一起。
  • 您可以使用 psr-7 HTTP 消息接口和此会话库创建一个框架无关的库/模块。

入门

$sessionOptions = [
    'name' => 'session_id',
    'sid_length' => 40,
    'cookie' => [
        'domain' => 'your-app.com',
    ]
];

$sessionHandler = new Ojhaujjwal\Session\Handler\FileHandler('path/to/session-data');
$sessionManager = new Ojhaujjwal\Session\SessionManager(
    $sessionHandler,
    $request,
    $sessionOptions
);
$storage = $sessionManager->getStorage();

$sessionManager->start();

// you can manipulate $storage just like $_SESSION   
$storage['some_key'] = 'some_value';
$someKey = $storage['some_key'];

$response = $sessionManager->close($response);
//return the response the the client

安装

composer require ujjwal/psr7-http-session

会话选项

name

类型:字符串 必需:是

用于作为 cookie 名称的会话名称。它应仅包含字母数字字符。

sid_length

类型:整数 默认:40

会话 ID 字符串的长度。会话 ID 长度可以是 22 到 256 之间。

cookie

类型:数组

用于传递 cookie 选项。请参阅 cookie 选项部分。

Cookie 选项

domain

类型:字符串 默认:从请求的 Host 标头派生

要在会话 cookie 中设置的域。

path

类型:字符串 默认:/

要在会话 cookie 中设置的路径。

http_only

类型:布尔值 默认:true

将 cookie 标记为仅通过 HTTP 协议访问。这意味着 cookie 不会通过脚本语言(如 JavaScript)访问。

secure_only

类型:布尔值 默认:如果原始请求是 https 则为 True

它表示是否应仅通过安全连接发送 cookie。

lifetime

类型:整数 默认:0(会话 cookie)

它指定发送到浏览器的 cookie 的有效期(以秒为单位)。值 0 表示“直到浏览器关闭”。默认为 0

same_site

类型:字符串 默认:Lax 指定 SameSite cookie 属性。非常有用,可以通过防止浏览器在跨站请求中发送此 cookie 来减轻 CSRF。允许的值

  • 空字符串表示不设置该属性
  • ParagonIE\Cookie\Cookie::SAME_SITE_RESTRICTION_LAX(相当严格)
  • ParagonIE\Cookie\Cookie::SAME_SITE_RESTRICTION_STRICT(非常严格)

基本操作

初始化 SessionManager

$sessionManager = new Ojhaujjwal\Session\SessionManager(
    $sessionHandler,
    $request,
    $sessionOptions
);

启动会话

$sessionManager->start();

$sessionManager->isStarted(); // returns true

检索会话 ID

$sessionManager->getId(); //returns alphanumeric string

重新生成会话 ID

$sessionManager->regenerate();

$sessionManager->regenerate(false); // does not destroy old session

关闭会话并将其写入响应头作为 cookie

$response = $sessionManager->close($response);

检索会话存储

$storage = $sessionManager->getStorage();

它实现了 IteratorAggregateArrayAccessCountable。因此,它将非常类似于 $_SESSION。只需将应用程序中的 $_SESSION 出现替换为对象的实例即可。

写入会话

$storage->abcd = 'efgh';
//or
$storage['abcd'] = 'efgh';
//or
$storage->set('abcd', 'efgh');

从会话中读取

$abcd =  $storage->abc;
//or
$abcd = $storage['abcd'];
//or
$abcd = $storage->get('abcd');

从会话中删除

unset($storage->abc);
//or
unset($storage['abcd']);
//or
$storage->remove('abcd');

刷新会话数据

$storage->flush();

会话中间件

它还附带一个 http 中间件,您可以使用它来自动初始化会话并将 cookie 写入响应。中间件与基于 http-interop/http-middleware 的单次遍历方法或类似 express 的双次遍历方法兼容。

 $middleware = new Ojhaujjwal\Session\SessionMiddleware($handler, $sessionOptions);
 $middleware->process($request, $delegate);
 // or
 $middleware($request, $response, $next);
 
 //using with zend-expressive
 //after errorhandler and before the routing middleware
 $app->pipe(\Ojhaujjwal\Session\SessionMiddleware::class);

待办事项

  • 修复 php7.2 中的构建
  • 垃圾收集
  • 基于Cookie的会话处理器
  • 加密会话处理器

许可证

MIT许可证