Symfony Session桥接遗留应用程序

3.4 版本
维护中的版本

如果你整合symfony完整框架到一个遗留的应用程序,他使用的是session_start()启动session,你仍然可以使用Symfony的session管理,但需要通过php桥接session(PHP Bridge session)。

假如应用程序有他自己的php保存操作(save handler),你可以指定handler_id为空:

1
2
3
4
framework:
    session:
        storage_id: session.storage.php_bridge
        handler_id: ~
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:framework="http://symfony.com/schema/dic/symfony">
 
    <framework:config>
        <framework:session storage-id="session.storage.php_bridge"
            handler-id="null"
        />
    </framework:config>
</container>
1
2
3
4
5
$container->loadFromExtension('framework', array(
    'session' => array(
        'storage_id' => 'session.storage.php_bridge',
        'handler_id' => null,
));

另外,如果问题是您不能消除让应用程序以 session_start() 启动session,您仍然可以使用基于Symfony的session保存操作,只不过你需要指定这个保存操作(handler_id),就像下面一样:

1
2
3
4
framework:
    session:
        storage_id: session.storage.php_bridge
        handler_id: session.handler.native_file
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:framework="http://symfony.com/schema/dic/symfony">
 
    <framework:config>
        <framework:session storage-id="session.storage.php_bridge"
            handler-id="session.storage.native_file"
        />
    </framework:config>
</container>
1
2
3
4
5
$container->loadFromExtension('framework', array(
    'session' => array(
        'storage_id' => 'session.storage.php_bridge',
        'handler_id' => 'session.storage.native_file',
));

如果这个遗留的应用程序需要自己的Session保存操作(session save handler),请不要重写它。设置handler_id: ~来替代即可。请注意,一旦Session被启用,Session保存操作将不能被更改。如果应用程序在symfoy初始化之前启动session,保存操作就已经准备好了。在这种情况下,您将需要handler_id:~。只有在你确定遗留应用程序可以使用symfony保存操作无副作用时并且symfony初始化之前session不能被启动时,才可以重写保存操作(session save handler)。

更多信息请查看,整合传统Session

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

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