我可能会以错误的方式解决这个问题,但我想做的是根据我的路线更改会话名称。我希望它与路由前缀完全一致,但实际上,无论如何配置它都没关系。
我想做的是:
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
但是,显然,这不起作用。我真的需要创建类似自定义会话存储或路由加载器的东西,还是有更简单的方法来完成我想要做的事情?
答案 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 }