会话管理
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
会话管理
Symfob娱乐下载ony HttpFoundation组件有一个非常强大和灵活的会话子系统,它被设计成通过一个简单的面向对象的接口,使用各种会话存储驱动程序来提供会话管理。
会话通过simple使用会话的实现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 ()
.
会话属性
- 设置()
- 按键设置属性。
- get ()
- 按键获取属性。
- 所有()
- 获取所有属性为key => value的数组。
- 有()
- 如果属性存在,则返回true。
- 替换()
- 一次设置多个属性:接受一个键控数组并设置每个key =>值对。
- remove ()
- 按键删除属性。
- clear ()
- 清除所有属性。
属性存储在内部的“Bag”中,这是一个类似数组的PHP对象。“包”管理有以下几种方法:
- 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 ()
- 返回会话包的名称。
属性
该袋子的目的是实现的AttributeBagInterface是处理会话属性存储。这可能包括用户ID、登录设置或其他基于用户的状态信息。
- AttributeBag
- 这是标准的默认实现。
- NamespacedAttributeBag
- 这种实现允许将属性存储在结构化的名称空间中。
任何普通键-值存储系统在复杂数据的存储范围上都是有限的,因为每个键必须是唯一的。您可以通过向键引入命名约定来实现命名空间,这样应用程序的不同部分就可以在不发生冲突的情况下操作。例如,module1.foo
而且module2.foo
.然而,当属性数据是一个数组(例如一组令牌)时,有时这不是很实用。在这种情况下,管理数组成为一个负担,因为你必须检索数组,然后处理它并再次存储它:
1 2 3 4 5 6
$令牌=数组(“令牌”= >数组(“一个”= >“a6c1e0b6”,“b”= >“f4a7b1f3”,),);
因此,任何处理都可能很快变得丑陋,甚至只是简单地向数组中添加一个令牌:
1 2 3
$令牌=$会话->get (“令牌”);$令牌[“c”] =$价值;$会话->集(“令牌”,$令牌);
使用结构化名称空间,键可以使用名称空间字符(默认为/
):
1
$会话->集(“令牌/ c”,$价值);
通过这种方式,您可以轻松地直接访问存储数组中的键。
AttributeBagInterface有一个简单的API
Flash的消息
的目的FlashBagInterface是提供一种在每个会话基础上设置和检索消息的方法。通常的工作流程是在请求中设置flash消息,并在页面重定向后显示它们。例如,用户提交的表单命中了更新控制器,处理后控制器将页面重定向到已更新的页面或错误页面。在前一个页面请求中设置的Flash消息将在该会话的后续页面加载中立即显示。然而,这只是flash消息的一个应用程序。
- AutoExpireFlashBag
- 在此实现中,在一个页面加载中设置的消息将只能在下一个页面加载中显示。无论是否检索到这些消息,这些消息都将自动过期。
- FlashBag
- 在此实现中,消息将保留在会话中,直到显式检索或清除它们。这使得使用ESI缓存成为可能。
FlashBagInterface有一个简单的API
- add ()
- 将一条flash消息添加到指定类型的堆栈。
- 设置()
-
按类型设置闪光;此方法方便地将两个单个消息作为
字符串
或多个消息数组
. - get ()
- 按类型获取闪光,并从包中清除那些闪光。
- setAll ()
-
设置所有闪光,接受数组的键控数组
类型=>数组(消息)
. - 所有()
- 获取所有闪光灯(作为数组的键控数组)并从包中清除闪光灯。
- 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 >”;}}