mindplay/session

PHP 的类型提示会话容器

2.0.0 2015-08-18 14:03 UTC

This package is auto-updated.

Last update: 2024-08-25 19:22:20 UTC


README

此库实现了类型提示的会话模型对象容器。

这种方法让您在处理任何类型的会话状态时都有类型提示的闭包,这对于 IDE 支持和代码理解非常有用。

Build Status

Code Coverage

Scrutinizer Code Quality

用法

注意,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 属性的内容进行断言,该属性包含原始的会话模型对象,并按类名索引。