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.
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). –
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