2012-10-08 15 views
10

Jaki jest najlepszy sposób na rozpoczęcie sesji w Zend Framework 2? Próbowałem ustawić session_start() w moim pliku index.php, ale to zostanie uruchomione przed załadowaniem autoloaderów, co prowadzi do niekompletnych obiektów znajdujących się w moich sesjach.Sesje Bootstrap w Zend Framework 2

W ZF1 mógłbyś zainicjować sesje dodając kilka opcji do konfiguracji, ale nie mam pojęcia, jak to zrobić w ZF2.

Odpowiedz

27

Jeśli dobrze rozumiem, wszystko, co chcesz zrobić, to czy twoja sesja działa prawidłowo w twoich modułach? Zakładając, że to prawda, są dwa pojedyncze kroki.

1) Tworzenie config: module.config.php

return array(
    'session' => array(
     'remember_me_seconds' => 2419200, 
     'use_cookies' => true, 
     'cookie_httponly' => true, 
    ), 
); 

2) Na dobry początek sesji: Module.php

use Zend\Session\Config\SessionConfig; 
use Zend\Session\SessionManager; 
use Zend\Session\Container; 
use Zend\EventManager\EventInterface; 

public function onBootstrap(EventInterface $evm) 
{ 
    $config = $evm->getApplication() 
        ->getServiceManager() 
        ->get('Configuration'); 

    $sessionConfig = new SessionConfig(); 
    $sessionConfig->setOptions($config['session']); 
    $sessionManager = new SessionManager($sessionConfig); 
    $sessionManager->start(); 

    /** 
    * Optional: If you later want to use namespaces, you can already store the 
    * Manager in the shared (static) Container (=namespace) field 
    */ 
    Container::setDefaultManager($sessionManager); 
} 

Znajdź więcej opcji w dokumentacji \Zend\Session\Config\SessionConfig

Jeśli chcesz przechowywać również pliki cookie, przejdź do strony this Question. Podziękowania dla Andreasa Lindena za jego wstępną odpowiedź - po prostu kopiuję wklejanie jego.

+1

Dzięki, to zadziałało. Jako uwaga dla każdego, kto tego używa, rzuciłem to w mój moduł aplikacji (którego używam w większości mojej głównej konfiguracji) i upewniłem się, że zostało ono załadowane jako pierwsze. – dragonmantank

+2

Czy mógłbyś wyjaśnić, jak ustawić ZF2 Session, aby była automatycznie niszczona za każdym razem, gdy zamykam przeglądarkę? Standardowym sposobem jest ustawienie 'cookie_lifetime = 0'. Ale z ZF2 to nie działa. Nie niszczy sesji przy zamknięciu przeglądarki. Również jeśli ustawię 'remember_me_seconds = 1' (zero zgłasza wyjątek) to też nie działa - wszystkie informacje bezpiecznie istnieją w sesji po zamknięciu przeglądarki. Jak ustawić taką opcję w ZF2? Dziękuję Ci. – Green

+0

Jak rozumiem, nie należy używać statycznego setDefaultManager do przekazania menedżera do kontenera. Należy utworzyć instancję kontenera i wprowadzić menedżera za pomocą konstruktora lub użyć menedżera setManager. – markus