2016-06-23 2 views
7

lesen Ich habe zwei Anwendungen. Eines davon ist in Zend Framework geschrieben und ein neues in Symfony 3.1 sollte die Sitzung mit einem alten teilen.Wie Zend2 Sitzung in Symfony3 Anwendung

In alten Anwendung native Dateispeicher verwendet wird, wenn ich zu app_dev.php gehen und ich schreibe session_start(); var_dump($_SESSION); Ich sehe '__ZF' Schlüssel in der Sitzung und ich muss Zugriff darauf in Symfony3-Anwendung erhalten.

Offensichtlich Code oben war nur zu überprüfen, ob Sitzung innerhalb der Domäne freigegeben ist.

In Symfony3 App habe ich versucht, das Ereignis KernelEvents::REQUEST zu subskribieren und da wollte ich Raw-Session von der Anfrage bekommen und eine Tasche mit Parametern, die von Zend2 kommen.

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)) 
     ); 
    } 
} 

Aber ich habe keinen Zugriff auf Rohdaten der Sitzung von $event->getRequest();

Dies ist, wie meine Tasche so weit sieht. Von dem, was ich verstehe, Zugang zu Rohdaten der Sitzung in initialize() -Methode

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

Also, wenn ich die Sitzung und dann dem Namen bekommen Tasche „zf“ Ich sollte ich Zugriff auf die Daten haben.

Dies ist auch meine Config in Bezug auf Sitzungen:

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

Jede Hilfe würde geschätzt.

+0

Haben Sie darüber nachgedacht, [TheodoEvolutionSessionBundle] (https://github.com/theodo/TheodoEvolutionSessionBundle) zum Überbrücken von Legacy-Sitzungen zu verwenden? Der Hauptunterschied besteht darin, dass Sie Ihre eigene Taschenimplementierung registrieren, aber das Paket [verwendet die von Symfony bereitgestellten Pakete] (https://github.com/theodo/TheodoEvolutionSessionBundle/blob/master/Manager/BagManager.php#L36). –

+0

Ja Ich habe es versucht, aber es ist nicht kompatibel mit SF 3.1 Ich habe auch versucht, eine ähnliche Lösung zu implementieren, wie sie es taten, aber es hat nicht funktioniert – Robert

Antwort

2

Ich habe es geschafft, damit es funktioniert.

Zum einen habe ich geändert Konfiguration:

Ich habe speichern Pfad geändert und entfernen nativen Handler:

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

Dann habe ich geändert 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)) 
     ); 
    } 
} 

Ich habe importierte Klasse von Zend Zend\Stdlib\ArrayObject danach habe ich Zugriff auf Variablen, die ich in Tasche zf haben möchte.