mindplay / session
PHP 的类型提示会话容器
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/php-code-coverage: 2.*@dev
This package is auto-updated.
Last update: 2024-08-25 19:22:20 UTC
README
此库实现了类型提示的会话模型对象容器。
这种方法让您在处理任何类型的会话状态时都有类型提示的闭包,这对于 IDE 支持和代码理解非常有用。
用法
注意,SessionService
不会尝试控制 PHP 会话的生命周期 - 它只提供了一种类型安全的方法来将序列化对象存储在会话变量中;您仍然需要负责启动会话,例如使用 session_start()
等。
设置
假设您有一个如下所示的会话模型
class Cart { /** @var int */ public $user_id; /** @var int[] */ public $product_ids = array(); }
在实际项目中,您可能想使用依赖注入容器或其他方式集中管理您的 SessionContainer
实例。
在请求周期结束时(例如,在分发控制器之后但在发送响应之前),您必须调用 commit()
以存储会话数据
// commit session container contents to session variables: $session->commit();
这确保了在出现错误时不会对会话变量进行部分更改。如果您不关心事务性会话并且希望更改自动提交,您可以注册一个关闭函数,例如
register_shutdown_function(function () use ($session) { $session->commit(); });
使用会话模型容器
在以下示例中,为了简单起见,我们假设您的会话容器是一个全局变量
use mindplay\session\SessionContainer; $session = new SessionContainer();
请注意,在实际项目中,您可能想对控制器等使用抽象 SessionContainer
接口进行类型提示,因为调用例如 commit()
在那里是不相关的。
要访问/更新会话模型对象,请将类型提示的闭包传递给 update()
方法
// add some products to the Cart: $session->update( function (Cart $cart) { $cart->product_ids[] = 777; $cart->product_ids[] = 555; } );
update()
方法将为您构造 Cart
- 因此,请注意,会话模型类必须始终有一个空构造函数。
您也可以从容器中取出值
$cart = $session->update(function (Cart $cart) { return $cart; });
但请注意,通常不建议从容器中取出会话模型对象,因为这会模糊您正在更改会话状态的事实 - update()
调用可以清楚地说明您正在做什么。
要删除会话模型对象
// empty the cart: $session->remove(Cart::class);
如果您有会话模型对象的引用,remove()
也会接受。
可选的会话模型
如果您不知道会话模型是否已经构建,并且您想避免创建空的会话模型,您可以在闭包中使用默认的 null
参数
$session->update( function (Cart $cart = null) { if ($cart) { // ... } } );
一次调用多个模型
如果您需要同时获取两个(或更多)会话模型对象,只需请求它们即可
$session->update(function (User $user, Cart $cart) { // ... });
删除所有会话模型
要删除所有会话模型,请调用 clear()
方法。
请注意,会话模型在调用 commit()
之前不会被从底层存储中删除。
自定义存储和测试
包含一个 MockSessionStorage
实现,这对于集成测试很有用 - 您可以在构造时提供此实现(或任何 SessionStorage
实现),例如
use mindplay\session\MockSessionStorage; use mindplay\session\SessionContainer; $storage = new MockSessionStorage('foo'); $container = new SessionContainer($storage);
在集成测试期间,您可以对公共 MockSessionStorage::$data
属性的内容进行断言,该属性包含原始的会话模型对象,并按类名索引。