Symfony2 - 基于Route的会话名称

时间:2016-03-18 18:51:00

标签: php symfony session

我可能会以错误的方式解决这个问题,但我想做的是根据我的路线更改会话名称。我希望它与路由前缀完全一致,但实际上,无论如何配置它都没关系。

我想做的是:

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

但是,显然,这不起作用。我真的需要创建类似自定义会话存储或路由加载器的东西,还是有更简单的方法来完成我想要做的事情?

1 个答案:

答案 0 :(得分:2)

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

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()内容之前进入会话,那么您应该没问题。< / p>

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

的appbundle \事件\ SessionNameSubscriber

class SessionNameSubscriber implements EventSubscriberInterface
{
    private $routeSessionNames = array(
        'my_routes_1' => 'ROUTE1SESSID',
        'my_routes_2' => 'ROUTE2SESSID',
        'my_routes_3' => 'ROUTE3SESSID',
    );

    /**
     * @var SessionInterface
     */
    private $session;

    public function __construct(SessionInterface $session = null)
    {
        $this->session = $session;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        // If no session is loaded do not set name.. obviously
        if (null === $this->session) {
            return;
        }

        $currentRoute = $request->attributes->get('_route');

        foreach ($this->routeSessionNames as $route => $sessionName) {
            if (strpos($currentRoute, $route) === 0) {
                $this->session->setName($sessionName);
            }
        }
    }

    public function getSubscribedEvents()
    {
        return array(
            KernelEvents::REQUEST => array('onKernelRequest', 2048)
        );
    }
}

的appbundle /资源/配置/ services.yml

app.subscriber.set_session_name:
    class: AppBundle\Event\SessionNameSubscriber\SessionNameSubscriber
    arguments:
        - "@?session"
    tags:
        - { name: kernel.event_subscriber }