MongoDbSessionHandler在MongoDB NoSQL数据库来存储会话。首先,一定要有一个工作MongoDB在Symfony应用程序连接的解释ob娱乐下载DoctrineMongoDBBundle配置篇文章。

然后,注册一个新的处理程序服务MongoDbSessionHandler并通过MongoDB连接作为参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”

接下来,使用handler_id配置选项告诉Symfony使用此服务的会话处理程序:ob娱乐下载

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ framework.yaml框架:会话:#……handler_id:ob娱乐下载Symfony \组件\ HttpFoundation \会议\ \ MongoDbSessionHandler存储\处理程序

请注意

MongoDB ODM 1。x仅适用于遗留司机,不再支持的Symfony会话类。ob娱乐下载安装阿尔凯奥斯/ mongo-php-adapter包检索底层\ MongoDB \客户对象或升级到MongoDB ODM 2.0。

这是所有!ob娱乐下载Symfony将现在使用MongoDB服务器读写会话数据。你不需要做任何事情来初始化您的会话集合。然而,您可能想添加一个索引来提高垃圾收集的性能。运行这个的MongoDB shell:

1 2
使用session_db db.session。方法createIndex ({“expires_at”:1},{expireAfterSeconds:0})

MongoDbSessionHandler服务:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……ob娱乐下载Symfony \ HttpFoundation \会议\ \组件存储\处理器\ MongoDbSessionHandler:参数:- - - - - -“@doctrine_mongodb.odm.default_connection”- - - - - -{id_field:“_guid”,“expiry_field”:“终点”}

这些参数可以配置:

id_field(默认_id):
字段的名称在哪里存储会话ID;
data_field(默认数据):
领域的名称来存储会话数据;
time_field(默认时间):
领域的名称来存储会话创建时间戳;
expiry_field(默认expires_at):
字段的名称在哪里存储会话。
. .指数::
单:会话、节约的地区

MigratingSessionHandler新旧之间的迁移不丢失会话数据保存处理程序。

这是推荐的迁移工作流:

  1. 和你的新处理程序切换到迁移处理程序,只写一个。旧的处理程序的行为像往常一样和会话写入新一:

    1
    美元sessionStorage=MigratingSessionHandler (美元oldSessionStorage,美元欧宝平台是合法的吗newSessionStorage);
  2. 您的会话gc周期后,验证新处理程序中的数据是正确的。
  3. 更新迁移处理程序使用旧的处理程序只写一个,因此,会话将会从新的处理程序读取。这个步骤允许简单的回滚:

    1
    美元sessionStorage=MigratingSessionHandler (美元欧宝平台是合法的吗newSessionStorage,美元oldSessionStorage);
  4. 后在您的应用程序正在验证会话,从处理程序迁移到新的处理程序。

新的事件订阅者。通常情况下,_locale作为路由参数表示地区,尽管您可以确定正确的地区,但是你想要的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40
/ / src / EventSubscriber / LocaleSubscriber.php名称空间应用程序\EventSubscriber;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpKernel\事件\RequestEvent;使用ob娱乐下载\组件\HttpKernel\KernelEvents;LocaleSubscriber实现了EventSubscriberInterface{私人美元defaultLocale;公共函数__construct(字符串美元defaultLocale=“en”){美元- >defaultLocale =美元defaultLocale;}公共函数onKernelRequestRequestEvent (美元事件){美元请求=美元事件- >getRequest ();如果(!美元请求- >hasPreviousSession ()) {返回;}/ /尝试看看区域被设置为一个_locale路由参数如果(美元语言环境=美元请求- >属性- >get (“_locale”)){美元请求- >getSession ()- >集(“_locale”,美元语言环境);}其他的{/ /如果没有明确的区域设置在这个请求时,使用一个会话美元请求- >setLocale (美元请求- >getSession ()- >get (“_locale”,美元- >defaultLocale));}}公共静态函数getSubscribedEvents(){返回(/ /必须注册之前(即优先级高于)默认区域设置侦听器KernelEvents::请求= > [[“onKernelRequest”,20.]]];}}

如果你使用默认的服务。yaml的配置,你做的!ob娱乐下载Symfony会自动知道事件订阅者和调用onKernelRequest方法针对每个请求。

看到它工作,设置_locale关键在会话手动(例如通过一些“改变语言环境”路线和控制器),或者创建一个路线_locale违约

你也可以显式地配置它,以通过的default_locale:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……App \ EventSubscriber \ LocaleSubscriber:参数:[' % kernel.default_locale % ')#取消如果你不使用autoconfigure的下一行#标签(kernel.event_subscriber):

现在庆祝通过改变用户的语言环境,看到它是粘在整个请求。

记住,得到用户的语言环境,总是使用要求::getLocale方法:

1 2 3 4 5 6 7
/ /从一个控制器…使用ob娱乐下载\组件\HttpFoundation\请求;公共函数指数(请求美元请求){美元语言环境=美元请求- >getLocale ();}

LocaleSubscriber之前被称为FirewallListener负责处理身份验证和设置用户令牌TokenStorage,您没有访问的用户登录。

假设您有一个语言环境财产在你用户实体,想用这个作为给定用户的语言环境。为了实现这一点,您可以钩到登录过程和更新用户的会话与这个地区值之前,他们被重定向到第一页。

要做到这一点,你需要一个事件订阅者security.interactive_login事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37
/ / src / EventSubscriber / UserLocaleSubscriber.php名称空间应用程序\EventSubscriber;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\HttpFoundation\RequestStack;使用ob娱乐下载\组件\安全\Http\事件\InteractiveLoginEvent;使用ob娱乐下载\组件\安全\Http\SecurityEvents;/ * * *存储区域*登录后的用户在会话中。这可以通过LocaleSubscriber之后。* /UserLocaleSubscriber实现了EventSubscriberInterface{私人美元requestStack;公共函数__construct(RequestStack美元requestStack){美元- >requestStack =美元requestStack;}公共函数onInteractiveLogin(InteractiveLoginEvent美元事件){美元用户=美元事件- >getAuthenticationToken ()- >getUser ();如果(= = !美元用户- >getLocale ()) {美元- >requestStack- >getSession ()- >集(“_locale”,美元用户- >getLocale ());}}公共静态函数getSubscribedEvents(){返回[SecurityEvents::INTERACTIVE_LOGIN = >“onInteractiveLogin”,);}}

谨慎

为了更新语言用户后立即改变了他们的语言首选项,您还需要更新会话当你改变用户实体。