jasny/session-middleware

支持模拟会话的PSR-15会话中间件

v1.1.0 2020-04-16 00:00 UTC

This package is auto-updated.

Last update: 2024-09-17 10:42:42 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Packagist Stable Version Packagist License

使用类似于$_SESSION对象的全局变量使得测试应用程序变得困难,因为全局变量可能会产生意外的副作用。使用全局变量会破坏使用依赖注入和容器的努力。

中间件创建了一个封装$_SESSION的对象,该对象可用于依赖注入,并作为PSR-7 ServerRequest的属性。中间件遵循PSR-15。它还可以作为双重遍历中间件工作。

安装

composer require jasny/session-middleware

用法

use Jasny\Session\SessionMiddleware;

$router->add(new SessionMiddleware());
$response = $router->handle($request);

从PSR-7 ServerRequest对象中获取会话对象,并将其用作数组

$session = $request->getAttribute('session');
$session['foo.bar'] = 10;

if (isset($session['foo.user'])) {
  // ...
}

中间件启动会话。

方法

会话对象实现了SessionInterface接口,并具有以下方法;

  • start() - 启动会话。
  • status() - 获取会话状态。
  • stop() - 写入会话数据并结束会话。
  • abort() - 忽略会话数组更改并完成会话。
  • clear() - 从会话中清除所有数据。
  • kill() - 销毁会话并删除会话cookie。
  • rotate() - 删除当前会话并启动一个新的会话。

在旋转会话时,可以通过提供回调来复制部分数据。

$session->rotate(fn(array $oldSessionData) => ['tid' => $oldSessionData['tid'] ?? null]);

会话选项

默认情况下,中间件将创建一个GlobalSession对象。此对象与PHP的会话管理相关联,包括$_SESSION。您可以手动实例化此对象,提供会话选项。这些选项传递给session_start()

use Jasny\Session\GlobalSession;
use Jasny\Session\SessionMiddleware;

$session = new GlobalSession([
    'cookie_lifetime' => 0,
    'cookie_httponly' => 1,
    'use_only_cookies' => 1,
    'use_trans_sid' => 0,
    'cookie_secure' => (bool)($_SERVER['HTTPS'] ?? false),
    'cookie_samesite' => 'Lax',
]);

$router->add(new SessionMiddleware($session));
$response = $router->handle($request);

闪存

会话闪存对象可用于将消息传递给下一个请求。使用后,它将自动从会话中删除。一个典型的用例是将信息存储在数据库中,然后重定向到页面并显示成功消息。或者如果信息无法保存,则显示错误消息。

闪存信息包含一个类型(例如successerrorinfowarning)和一个消息。可选地,可以为消息指定内容类型。默认为text/plain

$session->flash('success', 'The information has been saved');

在下一次请求中

{% for flash in app.flashes() %}
    <div class="flash-{{ flash.type }}">
        {{ flash.message }}
    </div>
{% endfor %}

如果调用flash()flashes(),则从会话中清除闪存消息。要防止此操作,请调用reissue()

$session->flashes()
    ->reissue()
    ->add('warning', "Could not display the page");

header('Location: /other-page');
exit();

调用$session->flashes()->clear()显式清除所有闪存消息,包括新添加到会话中以及当前请求中可用的消息。

测试

在运行测试时,您可以在将请求传递给中间件之前,在服务器请求中注入一个MockSession对象。

use Jasny\Session\MockSession;

$session = new MockSession([
  'foo.user' => 'john@example.com'
]);

$requestWithSession = $request->withAttribute('session', $session);
$response = $router->handle($requestWithSession);

或者,您可以在创建SessionMiddleware时传递一个会话对象。此会话对象将代替全局会话使用。

use Jasny\Session\SessionMiddleware;
use Jasny\Session\MockSession;

$mockSession = new MockSession();

$router->add(new SessionMiddleware($mockSession));
$response = $router->handle($request);