会话

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

会话

欧宝娱乐app下载地址Symfony提供了一个会话对象和几个实用程序,您可以使用它们在请求之间存储关于用户的信息。

配置

会话由HttpFoundation组件,它包含在所有Symfony应用程序中,无论您如何安装欧宝娱乐app下载地址它。在使用会话之前,请检查它们的默认配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ framework.yaml框架:会话:#启用应用程序中的会话支持启用:真正的#会话存储服务ID。# NULL =表示使用PHP的默认会话机制handler_id:#提高用于会话的cookie的安全性cookie_secure:“汽车”cookie_samesite:“宽松”

设置handler_id配置选项为意味着Symfony将欧宝娱乐app下载地址使用原生PHP会话机制。会话元数据文件将存储在Symfony应用程序之外的一个由PHP控制的目录中。欧宝娱乐app下载地址虽然这通常简化了事情,但如果其他写入同一目录的应用程序具有较短的最大生存期设置,则一些与会话过期相关的选项可能无法正常工作。

如果您愿意,您可以使用session.handler.native_file服务handler_id让Symfon欧宝娱乐app下载地址y自己管理会话。另一个有用的选项是save_path,它定义了Symfony存储会话元数据文件的目录:欧宝娱乐app下载地址

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/包/ framework.yaml框架:会话:#……handler_id:“session.handler.native_file”save_path:' % kernel.project_dir % / var /会议/ % kernel.environment % '

查看Symfony配置参考以欧宝娱乐app下载地址了解更多关于其他可用配置的信息会话配置选项。此外,如果您更喜欢将会话元数据存储在数据库而不是文件系统中,请查看这篇文章:如何使用PdoSessionHandler存储会话在数据库中

基本用法

欧宝娱乐app下载地址Symfony提供了一个会话服务,如果您输入一个参数,该服务将被注入到您的服务和控制器中SessionInterface

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
使用欧宝娱乐app下载地址组件HttpFoundation会话SessionInterfaceSomeService私人会话公共函数__construct(SessionInterface会话->会话=会话;}公共函数someMethod()//在会话中存储属性以供以后重用->会话->集(“属性名称”“属性-值”);//通过名称获取属性喷火->会话->get (“foo”);//第二个参数是属性不存在时返回的值过滤器->会话->get (“过滤器”[]);/ /……}}

提示

每一个SessionInterface支持实现。如果您有自己的实现,请在参数中键入-hint。

存储的属性在该用户会话的剩余时间内保留在会话中。属性管理的键值对AttributeBag类。

如果您的应用程序需求比较复杂,您可能更喜欢使用命名空间会话属性哪些是用NamespacedAttributeBag类。在使用它们之前,重写会话替换默认的服务定义AttributeBagNamespacedAttributeBag

  • YAML
1 2 3 4 5 6 7 8
#配置/ services.yaml会话:公众:真正的类:欧宝娱乐app下载地址Symfony \ HttpFoundation \会议\会议\组件参数:(“@session.storage”,“@session.namespacedattributebag”“@session.flash_bag”session.namespacedattributebag:类:欧宝娱乐app下载地址Symfony组件\ \ HttpFoundation \会议\ \ NamespacedAttributeBag属性

避免为匿名用户启动会话

每当您读取、写入或甚至检查会话中是否存在数据时,会话都会自动启动。这可能会损害应用程序的性能,因为所有用户都会收到一个会话cookie。为了防止这种情况,你必须完全避免访问会话。

例如,如果模板包含一些代码来显示flash的消息,会话将开始,即使用户没有登录,即使你没有创建任何flash消息。为了避免这种行为,在尝试访问flash消息之前添加一个检查:

1 2 3 4 5 6 7 8
{#此检查阻止在没有flash消息时启动会话#}{%如果app.request.hasPreviousSession %}{%app.flash ('notice') %}中的消息<div“flash-notice”>{{message}}div>{%endfor%}{%endif%}
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。