2016-06-23 3 views
7

두 개의 응용 프로그램이 있습니다. 하나는 Zend Framework로 작성되었으며, 새로운 Symfony 3.1은 이전 세션과 세션을 공유해야합니다.Symfony3 응용 프로그램에서 Zend2 세션을 읽는 방법

이전 응용 프로그램에서 네이티브 파일 저장소가 사용되는 이유는 app_dev.php에 가서 session_start(); var_dump($_SESSION);이라고 쓰면 세션에서 '__ZF'키가 표시되고 symfony3 응용 프로그램에 액세스해야합니다.

분명히 위의 코드는 세션이 도메인 내에서 공유되는지 확인하는 것입니다.

symfony3 앱에서 나는 KernelEvents::REQUEST 이벤트를 등록하려고 노력했다. 요청에서 원시 세션을 얻고 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

나는 그걸 만들 수있었습니다.

첫째로 내가 변경 한 구성은 : EventSubscriber

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

내가 변경했습니다 :

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에서 수입 한 클래스 zf에서 변수를 액세스 할 수 있기 때문에 그 후에 Zend\Stdlib\ArrayObject을 가져옵니다.

관련 문제