yiisoft/session

一个会话服务,PSR-15 会话中间件,以及一个帮助使用一次性消息的服务。

2.1.0 2024-05-02 18:50 UTC

This package is auto-updated.

Last update: 2024-09-09 18:18:30 UTC


README

Yii

Yii Session


Latest Stable Version Total Downloads Build status Code Coverage Mutation testing badge static analysis type-coverage

该包实现了一个会话服务、PSR-15 会话中间件,以及一个帮助使用一次性消息的服务。

要求

  • PHP 8.0 或更高版本。

安装

该包可以使用 Composer 安装。

composer require yiisoft/session

为了在请求之间保持会话,您需要将 SessionMiddleware 添加到您的路由组或应用程序中间件中。当您在同一个应用程序中既有基于令牌的身份验证的 API 路由又有常规的 Web 路由时,应优先使用路由组。这样做可以避免启动 API 端点的会话。

Yii 3 配置

为了为特定组的路由添加会话,请按照以下方式编辑 config/routes.php

use Yiisoft\Router\Group;
use Yiisoft\Session\SessionMiddleware;

return [
    Group::create('/blog')
        ->middleware(SessionMiddleware::class)
        ->routes(
            // ...
        )
];

要为整个应用程序添加会话,请按照以下方式编辑 config/application.php

return [
    Yiisoft\Yii\Http\Application::class => [
        '__construct()' => [
            'dispatcher' => DynamicReference::to(static function (Injector $injector) {
                return ($injector->make(MiddlewareDispatcher::class))
                    ->withMiddlewares(
                        [
                            ErrorCatcher::class,
                            SessionMiddleware::class, // <-- add this
                            CsrfMiddleware::class,
                            Router::class,
                        ]
                    );
            }),
        ],
    ],
];

通用用法

您可以通过 SessionInterface 访问会话数据。

public function actionProfile(\Yiisoft\Session\SessionInterface $session)
{
    // get a value
    $lastAccessTime = $session->get('lastAccessTime');

    // get all values
    $sessionData = $session->all();
        
    // set a value
    $session->set('lastAccessTime', time());

    // check if value exists
    if ($session->has('lastAccessTime')) {
        // ...    
    }
    
    // remove value
    $session->remove('lastAccessTime');

    // get value and then remove it
    $sessionData = $session->pull('lastAccessTime');

    // clear session data from runtime
    $session->clear();
}

如果您需要一些数据在会话中保留到读取为止,例如在显示下一页上的消息时,您需要的是闪存消息。闪存消息是一种特殊类型的数据,它仅在当前请求和下一个请求中可用。之后,它将自动删除。

FlashInteface 的用法如下

/** @var Yiisoft\Session\Flash\FlashInterface $flash */

// request 1
$flash->set('warning', 'Oh no, not again.');

// request 2
$warning = $flash->get('warning');
if ($warning !== null) {
    // do something with it
}

打开和关闭会话

public function actionProfile(\Yiisoft\Session\SessionInterface $session)
{
    // start session if it's not yet started
    $session->open();

    // work with session

    // write session values and then close it
    $session->close();
}

注意:尽早关闭会话是一个好习惯,因为许多会话实现都在会话打开时阻止其他请求。

还有两种关闭会话的方法

public function actionProfile(\Yiisoft\Session\SessionInterface $session)
{
    // discard changes and close session
    $session->discard();

    // destroy session completely
    $session->destroy();    
}

自定义会话存储

当使用 Yiisoft\Session\Session 作为会话组件时,您可以提供自己的存储实现

$handler = new MySessionHandler();
$session = new \Yiisoft\Session\Session([], $handler);

自定义存储必须实现 \SessionHandlerInterface

文档

如果您需要帮助或有任何问题,请访问 Yii 论坛。您还可以查看其他 Yii 社区资源

许可

Yii Session 是免费软件。它根据 BSD 许可证发布。有关更多信息,请参阅 LICENSE

Yii Software 维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack