2016-06-23 19 views
7

Tôi có hai ứng dụng. Một trong những di sản được viết trong Zend Framework và một cái mới trong Symfony 3.1 nên chia sẻ phiên với một cái cũ.Cách đọc phiên Zend2 trong ứng dụng Symfony3

Trong kho lưu trữ tệp gốc ứng dụng cũ được sử dụng vì vậy khi tôi truy cập app_dev.php và tôi viết session_start(); var_dump($_SESSION); Tôi thấy khóa '__ZF' trong phiên và tôi cần truy cập vào ứng dụng symfony3.

Rõ ràng mã ở trên chỉ để kiểm tra xem phiên có được chia sẻ trong miền không.

Trong ứng dụng symfony3 tôi đã cố gắng đăng ký sự kiện KernelEvents::REQUEST và ở đó tôi muốn nhận phiên thô từ yêu cầu và tạo một túi có thông số đến từ 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)) 
     ); 
    } 
} 

Nhưng tôi không có quyền truy cập vào dữ liệu phiên từ $event->getRequest();

Đây là cách túi của tôi trông cho đến nay. Từ những gì tôi hiểu rằng tôi cần phải có quyền truy cập vào dữ liệu phiên trong phương thức khởi()

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

Vì vậy, khi tôi nhận được phiên và sau đó nhận được túi có tên là "zf" Tôi sẽ có quyền truy cập vào dữ liệu.

Đây cũng là cấu hình liên quan đến tôi phiên:

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Bạn đã cân nhắc sử dụng [TheodoEvolutionSessionBundle] (https://github.com/theodo/TheodoEvolutionSessionBundle) để kết nối các phiên kế thừa? Sự khác biệt chính là bạn đang đăng ký triển khai túi của riêng mình nhưng gói [sử dụng các gói được cung cấp bởi Symfony] (https://github.com/theodo/TheodoEvolutionSessionBundle/blob/master/Manager/BagManager.php#L36). –

+0

Có Tôi đã thử nó nhưng nó không tương thích với SF 3.1 Tôi cũng đã cố gắng thực hiện giải pháp tương tự như họ đã làm nhưng nó không hoạt động – Robert

Trả lời

2

Tôi đã cố gắng làm cho nó hoạt động.

Trước hết tôi đã thay đổi cấu hình:

Tôi đã thay đổi lưu đường dẫn và loại bỏ handler mẹ đẻ:

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

Sau đó, tôi đã thay đổi 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)) 
     ); 
    } 
} 

Tôi đã nhập khẩu lớp học từ Zend Zend\Stdlib\ArrayObject sau đó tôi có quyền truy cập vào biến tôi muốn trong túi zf.

Các vấn đề liên quan