2016-06-23 27 views
7

私は2つのアプリケーションを持っています。 Zend Frameworkにはレガシーのものが1つ、Symfony 3.1の新しいものは古いものとセッションを共有する必要があります。Symfony3アプリケーションでZend2セッションを読む方法

私はapp_dev.phpに行って、session_start(); var_dump($_SESSION);と書いていますが、セッションで '__ZF'キーが表示され、symfony3アプリケーションでアクセスする必要があります。

明らかに、上記のコードは、セッションがドメイン内で共有されているかどうかを確認することだけでした。

symfony3アプリでは、私はイベントKernelEvents::REQUESTを申請しようとしました。そこからリクエストからrawセッションを取得し、Zend2からのパラメータを含むバッグを作成したかったのです。

class SessionSubscriber implements EventSubscriberInterface 
{ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 

     if ($event->isMasterRequest() && true == $event->getRequest()->hasSession()) { 
      var_dump($event->getRequest()); 
      $event->getRequest()->getSession()->registerBag(new ZendSessionBag()); 
      var_dump($event->getRequest()->getSession()->getBag('zf')); 
      exit; 
      return; 
     } 
    } 
    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::REQUEST => (array('onKernelRequest', 127)) 
     ); 
    } 
} 

しかし、私はこれは私のバッグは、これまでにどのように見えるかです$event->getRequest();

からの生のセッションデータにアクセスすることはできません。私が理解から、私は私がセッションを取得して、名前の袋を得るとき

class ZendSessionBag implements SessionBagInterface 
{ 
    private $storageKey; 
    private $sessionData; 


    public function __construct($storageKey = '__ZF') 
    { 
     $this->storageKey = $storageKey; 
    } 

    public function getName() 
    { 
     return 'zf'; 
    } 

    public function initialize(array &$array) 
    { 
     var_dump($array); // here should be raw $_SESSION data 
     $this->sessionData = &$array; 
    } 

    public function getStorageKey() 
    { 
     return $this->storageKey; 
    } 

    public function clear() 
    { 
     $this->sessionData = []; 
    } 
} 

だから、「ZF」は、私がデータにアクセスする必要があります初期化()メソッド内の生セッションデータへのアクセス権を持っている必要があります。任意の助けをいただければ幸いです

session: 
     storage_id: session.storage.php_bridge 
     handler_id: session.handler.native_file 
     save_path: "/var/lib/php5/sessions" 

また、これは私の設定に関するセッションです。

+0

レガシーセッションのブリッジに[TheodoEvolutionSessionBundle](https://github.com/theodo/TheodoEvolutionSessionBundle)を使用したことはありますか?主な違いは、独自のバッグ実装を登録していることですが、バンドルは[Symfonyが提供するものを使用します](https://github.com/theodo/TheodoEvolutionSessionBundle/blob/master/Manager/BagManager.php#L36)。 –

+0

はい、試しましたが、SF 3.1と互換性がありません。同様のソリューションを実装しようとしましたが、動作しませんでした – Robert

答えて

2

私はそれを動作させることができました。

まず、私は設定変更した:

を私はパスを保存し、ネイティブハンドラを削除変更しました:

session: 
     save_path: "/var/lib/php5/sessions" 

その後、私はEventSubscriberを変更した:

class SessionSubscriber implements EventSubscriberInterface 
{ 
    /** 
    * @param GetResponseEvent $event 
    */ 
    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $bag = null; 
     $session = $event->getRequest()->getSession(); 

     try 
     { 
      $bag = $session->getBag('zf'); 
     } 
     catch (\InvalidArgumentException $e) 
     { 
      $bag = new NamespacedAttributeBag("__ZF"); 
      $bag->setName("zf"); 
      $session->registerBag($bag); 

      $session->start(); 
     } 
     $bag->set('userId', isset($_SESSION['Zend_Auth']->storage) ? $_SESSION['Zend_Auth']->storage : null); 
    } 

    /** 
    * @return array 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
      KernelEvents::REQUEST => (array('onKernelRequest', 127)) 
     ); 
    } 
} 

私がしましたZendから輸入されたクラスZend\Stdlib\ArrayObjectの後、私はバッグに入れたい変数へのアクセスを持っていますzf

関連する問題