整合传统Session

3.4 版本
维护中的版本

有时,把Symfony整合到遗产级程序中是必要的,但你难以根据需要从根本上控制代码。

如同在很多地方提到的,Symfony Sessions的设计理念是“取代PHP的原生session_*()函数和超全局变量$_SESSION”。此外,Symfony能在任何时候启动session。

不过,当面临的环境完全没可能(使用sf session)时,你可以使用一个特殊的storage bridge PhpBridgeSessionStorage(存储桥接),它可以令Symfony在HttpFoundation组件之外操作一个session。但是要注意的是,使用这个时程序可能会中断,除非你十分小心:例如,遗产程序可能会抹除$_SESSION

典型用例可能像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;
 
// legacy application configures session
// 遗产级程序中配置session
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/tmp');
session_start();
 
// Get Symfony to interface with this existing session
// 取得Symfony session来桥接既有的(旧式)session
$session = new Session(new PhpBridgeSessionStorage());
 
// symfony will now interface with the existing PHP session
// Symfony已经可以使用既有的session
$session->start();

Symfony sessions把数据像属性一样存入到特殊的“Bags”中,session包在$_SESSION超全局变量中使用一个键(key)。这意味着Symfony session无法在$_SESSION中任意访问那些“可能是被遗产级程序所设置的”键(keys),尽管当session在存储时,所有的$_SESSION内容都会被存下来。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)