会话管理
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
会话管理
Symfob娱乐下载ony HttpFoundation组件有一个非常强大和灵活的会话子系统,它被设计成通过一个清晰的面向对象的接口,使用各种会话存储驱动程序来提供会话管理。
会话通过会话的实现SessionInterface接口。
谨慎
在使用session类之前,请确保您的PHP会话尚未启动。如果您有启动会话的遗留会话系统,请参见遗产会议.
简单的例子:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\HttpFoundation\会话\会话;$会话=新会话();$会话->开始();//设置和获取会话属性$会话->集(“名字”,“庄严赞歌”);$会话->get (“名字”);//设置flash消息$会话->getFlashBag ()->add (“通知”,配置文件更新的);//获取信息foreach($会话->getFlashBag ()->get (“通知”[])作为$消息) {回声' < div class = " flash-notice”>“.$消息.“< / div >”;}
请注意
ob娱乐下载Symfony会话被设计用来替换一些原生PHP函数。应用程序应避免使用session_start ()
,session_regenerate_id ()
,session_id ()
,session_name ()
,session_destroy ()
而是使用下面一节中的api。
请注意
虽然建议显式地启动会话,但会话实际上将按需启动,也就是说,如果发出任何会话请求来读取/写入会话数据。
谨慎
ob娱乐下载Symfony会话不兼容php . ini
指令会话。Auto_start = 1
这个指令应该在中关闭php . ini
,在web服务器指令或. htaccess
.
会话API
的会话类实现SessionInterface.
的会话具有以下API,分为两组。
会议流程
- start ()
-
启动会话-不要使用
session_start ()
. - 迁移()
-
重新生成会话ID -不要使用
session_regenerate_id ()
.此方法可以有选择地更改将通过调用此方法发出的新cookie的生存期。 - 无效()
-
清除所有会话数据并重新生成会话ID。不要使用
session_destroy ()
. - getId ()
-
获取会话ID。不要使用
session_id ()
. - setId ()
-
设置会话ID。不要使用
session_id ()
. - getName ()
-
获取会话名称。不要使用
session_name ()
. - setName ()
-
设置会话名称。不要使用
session_name ()
.
会话属性
会话属性存储在一个“Bag”中,这是一个PHP对象,作用类似于数组。可以使用本文后面解释的方法来设置、删除、检查等AttributeBagInterface
类。看到会话管理.
此外,还有一些“袋子”管理的方法:
- registerBag ()
- 注册一个SessionBagInterface.
- getBag ()
- 获得一个SessionBagInterface按包名。
- getFlashBag ()
- 得到了FlashBagInterface.这只是为了方便而走的捷径。
会话的元数据
- getMetadataBag ()
- 得到了MetadataBag其中包含关于会话的信息。
会话数据管理
PHP的会话管理需要使用_SESSION美元
但是,这在某种程度上干扰了OOP范式中的代码可测试性和封装性。为了克服这个问题,Symfony使用了ob娱乐下载会议包链接到会话,以封装属性或flash消息的特定数据集。
类中的名称空间污染_SESSION美元
超全局是因为每个包都将其所有数据存储在唯一的名称空间下。这允许Symfony与其ob娱乐下载他可能使用_SESSION美元
所有数据都与Symfony的会话管理完全兼容。ob娱乐下载
ob娱乐下载Symfony提供了两种存储包,它们有两种独立的实现。所有内容都是根据接口编写的,因此如果需要,您可以扩展或创建自己的包类型。
SessionBagInterface具有以下API,主要用于内部用途:
- getStorageKey ()
-
返回包最终将数组存储在其中的键
_SESSION美元
.通常,这个值可以保留为默认值,供内部使用。 - 初始化()
- 这由Symfony会话存储类在内部调用,以将包数据链接到会ob娱乐下载话。
- getName ()
- 返回会话包的名称。
- clear ()
- 清除包中的数据。
属性
该袋子的目的是实现的AttributeBagInterface是处理会话属性存储。这可能包括用户ID、“记住我”登录设置或其他基于用户的状态信息。
- AttributeBag
- 这是标准的默认实现。
- NamespacedAttributeBag
-
这种实现允许将属性存储在结构化的名称空间中。
5.3
的
NamespacedAttributeBag
类自Symfony 5.3起已弃用。ob娱乐下载如果您需要这个特性,就必须自己实现这个类。
- 设置()
-
按名称设置属性(
集(“名字”,“价值”)
). - get ()
-
通过名称(
get(名字)
),并且可以在属性不存在时定义一个默认值(get(“名字”,“default_value”)
). - 所有()
-
的关联数组获取所有属性
Name => value
. - 有()
-
返回
真正的
如果属性存在。 - 替换()
-
使用关联数组(
Name => value
).如果属性存在,它们将被替换;如果不是,则创建它们。 - remove ()
- 按名称删除属性并返回其值。
- clear ()
- 删除所有属性。
例子:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\HttpFoundation\会话\属性\AttributeBag;使用ob娱乐下载\组件\HttpFoundation\会话\会话;使用ob娱乐下载\组件\HttpFoundation\会话\存储\NativeSessionStorage;$会话=新会话(新NativeSessionStorage (),新AttributeBag ());$会话->集(“令牌”,“a6c1e0b6”);/ /……$令牌=$会话->get (“令牌”);//如果属性可能存在或不存在,你可以为它定义一个默认值$令牌=$会话->get (“属性名称”,“default-attribute-value”);/ /……$会话->明确的();
名称空间属性
任何普通键-值存储系统在复杂数据的存储范围上都是有限的,因为每个键必须是唯一的。您可以通过向键引入命名约定来实现命名空间,这样应用程序的不同部分就可以在不发生冲突的情况下操作。例如,module1.foo
而且module2.foo
.然而,当属性数据是一个数组(例如一组令牌)时,有时这不是很实用。在这种情况下,管理数组成为一个负担,因为你必须检索数组,然后处理它并再次存储它:
1 2 3 4 5 6
$令牌= (“令牌”= > [“一个”= >“a6c1e0b6”,“b”= >“f4a7b1f3”,],];
因此,任何处理都可能很快变得丑陋,甚至向数组中添加一个令牌:
1 2 3
$令牌=$会话->get (“令牌”);$令牌[“c”] =$价值;$会话->集(“令牌”,$令牌);
5.3
的NamespacedAttributeBag
类自Symfony 5.3起已弃用。ob娱乐下载如果您需要这个特性,就必须自己实现这个类。
使用结构化名称空间,键可以使用名称空间字符(默认为/
):
1 2 3 4 5
/ /……使用ob娱乐下载\组件\HttpFoundation\会话\属性\NamespacedAttributeBag;$会话=新会话(新NativeSessionStorage (),新NamespacedAttributeBag ());$会话->集(“令牌/ c”,$价值);
Flash的消息
的目的FlashBagInterface是提供一种在每个会话基础上设置和检索消息的方法。通常的工作流程是在请求中设置flash消息,并在页面重定向后显示它们。例如,用户提交的表单命中了更新控制器,处理后控制器将页面重定向到已更新的页面或错误页面。在前一个页面请求中设置的Flash消息将在该会话的后续页面加载中立即显示。然而,这只是flash消息的一个应用程序。
- AutoExpireFlashBag
- 在此实现中,在一个页面加载中设置的消息将只能在下一个页面加载中显示。无论是否检索到这些消息,这些消息都将自动过期。
- FlashBag
- 在此实现中,消息将保留在会话中,直到显式检索或清除它们。这使得使用ESI缓存成为可能。
- add ()
- 将一条flash消息添加到指定类型的堆栈。
- 设置()
-
按类型设置闪光;此方法方便地将两个单个消息作为
字符串
或多个消息数组
. - get ()
- 按类型获取闪光,并从包中清除那些闪光。
- setAll ()
-
设置所有闪光,接受数组的键控数组
Type => [messages]
. - 所有()
- 获取所有闪光灯(作为数组的键控数组)并从包中清除闪光灯。
- peek ()
- 按类型获取闪光(只读)。
- peekAll ()
- 获取所有闪光(只读)作为数组的键控数组。
- 有()
- 如果类型存在则返回true,如果不存在则返回false。
- 键()
- 返回存储的flash类型的数组。
- clear ()
- 清理袋子。
对于简单的应用程序,通常每种类型有一个flash消息就足够了,例如在提交表单之后有一个确认通知。但是,flash消息通过flash存储在键控数组中美元的类型
这意味着应用程序可以针对给定类型发出多条消息。这允许API在应用程序中用于更复杂的消息传递。
设置多次闪光的例子:
12 3 4 5 6 7 8 9 10 11 12
使用ob娱乐下载\组件\HttpFoundation\会话\会话;$会话=新会话();$会话->开始();//添加flash消息$会话->getFlashBag ()->add (“警告”,你的配置文件是可写的,应该设置为只读);$会话->getFlashBag ()->add (“错误”,“更新名称失败”);$会话->getFlashBag ()->add (“错误”,另一个错误的);
显示flash消息可能如下所示。
显示一种类型的消息:
1 2 3 4 5 6 7 8 9
//显示警告foreach($会话->getFlashBag ()->get (“警告”[])作为$消息) {回声' < div class = " flash-warning”>“.$消息.“< / div >”;}//显示错误foreach($会话->getFlashBag ()->get (“错误”[])作为$消息) {回声' < div class = " flash-error”>“.$消息.“< / div >”;}
紧凑的方法处理显示所有闪光一次:
1 2 3 4 5
foreach($会话->getFlashBag ()->所有()作为$类型= >$消息) {foreach($消息作为$消息) {回声' < div class = " flash - '.$类型.“>”.$消息.“< / div >”;}}