jasny / session-middleware
支持模拟会话的PSR-15会话中间件
Requires
- php: >=7.4.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- jasny/php-code-quality: ~2.6
Suggests
- codeception/codeception: PHP testing framework
This package is auto-updated.
Last update: 2024-09-17 10:42:42 UTC
README
使用类似于$_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);
闪存
会话闪存对象可用于将消息传递给下一个请求。使用后,它将自动从会话中删除。一个典型的用例是将信息存储在数据库中,然后重定向到页面并显示成功消息。或者如果信息无法保存,则显示错误消息。
闪存信息包含一个类型(例如success
、error
、info
、warning
)和一个消息。可选地,可以为消息指定内容类型。默认为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);