2016-03-18 15 views
0

これは間違った方法ですが、私がやりたいことは私が持っているルートに基づいてセッション名を変更することです。私はそれがルートプレフィックスと正確に揃えたいと思いますが、とにかくそれを構成するには本当にうまくいくでしょう。動作しないこと、Symfony2 - ルートに基づくセッション名

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

もしあなたが何かしたいのなら、cあなたはあなた自身の実装でそれを上書きする必要がありません(もちろん既存のものを拡張することができます) – JimL

答えて

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()のいずれかを実行する前に取得していれば問題ありません。

私は

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 } 
+0

私はセッション名を設定する方法を探しています。 '' request.hasSession()&&(request.getSession()。setName( 'ROUTE3SESSID')|| true) "''しかし、symfonyは、アクティブなセッションの名前 – sgcharlie

+0

申し訳ありません..質問を正しく読まなかった。私は更新します。 – qooplmao

+0

これは私が必要としていたものです。私が望むルートにルートオプションを追加してルータを組み込み、リクエストからのルートを照合/照合するのに使用しましたが、それ以外はあまり変わっていないと思います – sgcharlie

関連する問題