Php Symfony2-基于路由的会话名称

Php Symfony2-基于路由的会话名称,php,symfony,session,Php,Symfony,Session,我可能走错了方向,但我想做的是根据我拥有的路由更改会话名称。我希望它与路由前缀完全一致,但实际上,无论如何配置它都可以 我想做的是: my_routes_1: resource: "@MyBundle1/Resources/config/routing.php" prefix: / session: name: ROUTE1SESSID my_routes_2: resource: "@MyBundle2/Resources/config/ro

我可能走错了方向,但我想做的是根据我拥有的路由更改会话名称。我希望它与路由前缀完全一致,但实际上,无论如何配置它都可以

我想做的是:

my_routes_1:
    resource: "@MyBundle1/Resources/config/routing.php"
    prefix:   /
    session:
        name: ROUTE1SESSID
my_routes_2:
    resource: "@MyBundle2/Resources/config/routing.yml"
    prefix:   /ab/
    session:
        name: ROUTE2SESSID
my_routes_3:
    resource: "@MyBundle3/Resources/config/routing.yml"
    prefix:   /cd/
    session:
        name: ROUTE3SESSID
但显然,这是行不通的。我真的需要创建自定义会话存储或路由加载器之类的东西吗?还是有更简单的方法来完成我想在这里做的事情?

您可以在路由中使用表达式来添加条件。该请求在路由表达式中可用,因此您应该能够签入该请求

my_routes_1:
    resource: "@MyBundle1/Resources/config/routing.php"
    prefix:   /
    condition: "request.hasSession() && 'ROUTE1SESSID' === request.getSession().getName()"

my_routes_2:
    resource: "@MyBundle2/Resources/config/routing.yml"
    prefix:   /ab/
    condition: "request.hasSession() && 'ROUTE2SESSID' === request.getSession().getName()"

my_routes_3:
    resource: "@MyBundle3/Resources/config/routing.yml"
    prefix:   /cd/
    condition: "request.hasSession() && 'ROUTE3SESSID' === request.getSession().getName()"'

对不起,这与问题无关

通过查看代码以及您所说的在激活会话名称后设置会话名称存在问题,似乎唯一的管理方法是在激活会话名称之前设置名称

要做到这一点,您可以先创建一个加载到onKernelRequest的侦听器,然后再从那里管理会话名称。从我所看到的情况来看,只有在令牌存储中首次请求会话时才会创建会话,因此基本上,如果您在安全上下文执行任何
[get | set | has | remove]token()
操作之前进入会话,那么您应该没事了

请注意,我没有以任何方式对此进行测试

AppBundle\Event\SessionNameSubscriber

AppBundle/Resources/config/services.yml

可以在路由中使用表达式来添加条件。该请求在路由表达式中可用,因此您应该能够签入该请求

my_routes_1:
    resource: "@MyBundle1/Resources/config/routing.php"
    prefix:   /
    condition: "request.hasSession() && 'ROUTE1SESSID' === request.getSession().getName()"

my_routes_2:
    resource: "@MyBundle2/Resources/config/routing.yml"
    prefix:   /ab/
    condition: "request.hasSession() && 'ROUTE2SESSID' === request.getSession().getName()"

my_routes_3:
    resource: "@MyBundle3/Resources/config/routing.yml"
    prefix:   /cd/
    condition: "request.hasSession() && 'ROUTE3SESSID' === request.getSession().getName()"'

对不起,这与问题无关

通过查看代码以及您所说的在激活会话名称后设置会话名称存在问题,似乎唯一的管理方法是在激活会话名称之前设置名称

要做到这一点,您可以先创建一个加载到onKernelRequest的侦听器,然后再从那里管理会话名称。从我所看到的情况来看,只有在令牌存储中首次请求会话时才会创建会话,因此基本上,如果您在安全上下文执行任何
[get | set | has | remove]token()
操作之前进入会话,那么您应该没事了

请注意,我没有以任何方式对此进行测试

AppBundle\Event\SessionNameSubscriber

AppBundle/Resources/config/services.yml


是的,如果你想做当前类/库没有做的事情,你需要用你自己的实现覆盖它(当然可以扩展现有的东西)是的,如果你想做当前类/库没有做的事情,你需要用你自己的实现覆盖它(当然可以扩展现有的东西)我正在寻找更多的方法来设置会话名称,而不是检查它。我尝试了类似的条件:
“request.hasSession()&&&(request.getSession().setName('route3sessiond')| | true)”
但symfony不喜欢尝试更改活动会话的名称这正是我所需要的。我在我想要的路由中添加了一个路由选项,包括路由器,并使用该选项直接匹配/验证来自请求的路由,但除此之外,我认为我没有改变。我正在寻找更多的方法来设置会话名称,而不是检查它。我尝试了类似的条件:
“request.hasSession()&&&(request.getSession().setName('route3sessiond')| | true)”
但symfony不喜欢尝试更改活动会话的名称这正是我所需要的。我在我想要的路由中添加了一个路由选项,包括路由器,并使用该选项直接匹配/验证来自请求的路由,但除此之外,我认为我没有做太多更改
app.subscriber.set_session_name:
    class: AppBundle\Event\SessionNameSubscriber\SessionNameSubscriber
    arguments:
        - "@?session"
    tags:
        - { name: kernel.event_subscriber }