会话管理
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.2,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
会话管理
Symfob娱乐下载ony2 HttpFoundation组件有一个非常强大和灵活的会话子系统,它被设计成通过一个简单的面向对象的接口,使用各种会话存储驱动程序来提供会话管理。
2.1
的SessionInterface接口,以及其他一些变化,都是Symfony 2.1的新功能。ob娱乐下载
会话通过simple使用会话的实现SessionInterface接口。
简单的例子:
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范式中的代码可测试性和封装性。为了帮助克服这个问题,Symfony2使用链接ob娱乐下载到会话的“会话包”来封装特定的“属性”或“flash消息”数据集。
类中的名称空间污染_SESSION美元
超全局是因为每个包都将其所有数据存储在唯一的名称空间下。这允许Symfony2和ob娱乐下载平地与其他应用程序或库共存_SESSION美元
所有数据都完全兼容Symfony2的会话管理。ob娱乐下载
ob娱乐下载Symfony2提供了两种存储袋,它们有两种独立的实现。所有内容都是根据接口编写的,因此如果需要,您可以扩展或创建自己的包类型。
SessionBagInterface具有以下API,主要用于内部用途:
- getStorageKey ():返回包最终将数组存储在其中的键
_SESSION美元
.通常,这个值可以保留为默认值,供内部使用。 - 初始化(): Symfony2会话存储类内部调用,将包数据链接到会话。ob娱乐下载
- getName ():返回会话包的名称。
属性
该袋子的目的是实现的AttributeBagInterface是处理会话属性存储。这可能包括用户ID、登录设置或其他基于用户的状态信息。
- AttributeBag这是标准的默认实现。
- NamespacedAttributeBag这种实现允许将属性存储在结构化的名称空间中。
任何普通的“key => value”存储系统在复杂数据的存储范围上都是有限的,因为每个键必须是唯一的。您可以通过向键引入命名约定来实现命名空间,这样应用程序的不同部分就可以在不发生冲突的情况下操作。例如,' module1。Foo '和' module2.foo '。然而,当属性数据是一个数组(例如一组令牌)时,有时这不是很实用。在这种情况下,管理数组成为一个负担,因为你必须检索数组,然后处理它并再次存储它:
1 2
$令牌=数组(“令牌”= >数组(“一个”= >“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 > \ n”;}}