在Symfony配置中有一个条目framework.session.storage_id
。此设置也出现在Symfony配置文档的默认配置中,但没有对此进行解释。我的假设是,它定义了会话数据在服务器端的存储位置。
我看到的该条目的值包括session.storage.mock_file
、session.storage.native
和session.storage.filesystem
。我不确定这些值的确切含义(例如,模拟文件和文件系统之间的区别是什么?),也认为这不是可能值的完整列表。
那么,这个配置键究竟控制着什么,哪些值是有效的呢?
framework.session.storage_id
的有效值如下:
session.storage.mock_file
-用于测试。它根本不启动会话session.storage.filesystem
-用于测试。它是session.storage.mock_file
的别名session.storage.native
-使用定义的会话处理程序的默认实现session.storage.php_bridge
-适用于传统应用程序
从开发人员的角度来看,有一个session
服务可以抽象处理会话。session
服务依赖于某些会话存储服务Session storage从PHP角度实现会话管理(例如调用session_start()
函数)存储还依赖于一些会话处理程序Handler是SessionStorage
的实现,它告诉如何以及在哪里物理存储会话。
这种三层设计允许为测试创建存储,该存储根本不调用session_start()
,也不使用处理程序(session.storage.mock_file
)。或者创建处理程序,该处理程序可以从任何位置存储和加载会话(session.storage.native
)。session.storage.php_bridge
解决了session_start()
由外部PHP代码调用(而不是由Symfony会话存储调用)的情况。
我希望大家都能明白。
Symfony中的会话管理基于两个主要规则。
- Symfony必须启动会话
- Symfony会话旨在取代PHP本机函数
session_*()
和$_SESSION
global的使用
但是,也存在一些例外情况。有时可能需要将Symfony集成到遗留应用程序中,该应用程序使用session_start()
启动会话。使用session.storage.php_bridge
指令,您可以使用一个特殊的网关来管理会话,该网关旨在允许Symfony处理在框架外启动的会话。
为了使使用会话的代码可测试,session.storage.mock_file
指令允许模拟PHP会话的流,而无需真正启动它。
对于Symfony 6.x,它已经改变了。举个例子,这对我来说很有效:
framework:
test: true
session:
storage_factory_id: session.storage.factory.mock_file