会话管理

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,现已不再维护。

本页的更新版本用于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,在webserver指令或. 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
这种实现允许将属性存储在结构化的名称空间中。

AttributeBagInterface有API

设置()
按名称设置属性(集(“名字”,“价值”)).
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”] =价值会话->集(“令牌”令牌);

使用结构化名称空间,键可以使用名称空间字符(默认为/):

1 2 3 4 5
/ /……使用ob娱乐下载组件HttpFoundation会话属性NamespacedAttributeBag会话会话(NativeSessionStorage (),NamespacedAttributeBag ());会话->集(“令牌/ c”价值);

Flash的消息

的目的FlashBagInterface是提供一种在每个会话基础上设置和检索消息的方法。通常的工作流程是在请求中设置flash消息,并在页面重定向后显示它们。例如,用户提交的表单命中了更新控制器,处理后控制器将页面重定向到已更新的页面或错误页面。在前一个页面请求中设置的Flash消息将在该会话的后续页面加载中立即显示。然而,这只是flash消息的一个应用程序。

AutoExpireFlashBag
在此实现中,在一个页面加载中设置的消息将只能在下一个页面加载中显示。无论是否检索到这些消息,这些消息都将自动过期。
FlashBag
在此实现中,消息将保留在会话中,直到显式检索或清除它们。这使得使用ESI缓存成为可能。

FlashBagInterface有API

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 >”;}}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。