2016-06-23 45 views
7

Mam dwie aplikacje. Jedna z nich jest napisana w Zend Framework, a nowa w Symfony 3.1 powinna współdzielić sesję ze starszą.Jak czytać sesję Zend2 w aplikacji Symfony3

W starej aplikacji używana jest natywna pamięć plików, więc kiedy wchodzę do app_dev.php i piszę session_start(); var_dump($_SESSION); widzę klawisz "__ZF" w sesji i muszę uzyskać do niego dostęp w aplikacji symfony3.

Oczywiście powyższy kod służy jedynie do sprawdzenia, czy sesja jest udostępniana w domenie.

W aplikacji symfony3 próbowałem zapisać wydarzenie KernelEvents::REQUEST i tam chciałem uzyskać surową sesję od żądania i stworzyć torbę z parametrami pochodzącymi od 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)) 
     ); 
    } 
} 

Ale nie mam dostęp do surowych danych sesyjnych od $event->getRequest();

To jest jak moja torba wygląda tak daleko. Z tego co rozumiem, muszę mieć dostęp do surowych danych sesyjnych w metodzie initialize()

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 = []; 
    } 
} 

Więc kiedy mam sesję, a następnie dostać torbę o nazwie „ZF” I będzie miał dostęp do danych.

To także moje konfiguracyjne dotyczące sesje:

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

Każda pomoc będzie mile widziane.

+0

Czy rozważałeś użycie [TheodoEvolutionSessionBundle] (https://github.com/theodo/TheodoEvolutionSessionBundle) do łączenia starszych sesji? Główną różnicą jest to, że rejestrujesz własną implementację worka, ale pakiet [używa tych dostarczonych przez Symfony] (https://github.com/theodo/TheodoEvolutionSessionBundle/blob/master/Manager/BagManager.php#L36). –

+0

Tak, próbowałem, ale jest to niezgodne z SF 3.1. Próbowałem też wdrożyć podobne rozwiązanie, ale nie zadziałało. – Robert

Odpowiedz

2

Udało mi się sprawić, żeby działało.

pierwsze Zmieniłem konfigurację:

Zmieniłem zapisać ścieżkę i usunąć natywnej obsługi:

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

Potem zmieniłem 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)) 
     ); 
    } 
} 

mam importowana klasa od Zend Zend\Stdlib\ArrayObject po tym mam dostęp do zmiennej, którą chcę w torbie zf.