2012-12-25 4 views
5

Czy możesz mi powiedzieć, jak prawidłowo korzystać z sesji w ZF2? Do tej pory mam ten kod:Sesje w ZF2

"session" => 
[ 
    "remember_me_seconds" => 2419200, 
    "use_cookies" => true, 
    "cookie_httponly" => true 
] 

To jest konfiguracja sesji, którą skopiowałem z jakiegoś posta tutaj na stackoverflow. Teraz powinienem umieścić ten kod w module.config.php w każdym module, który używa sesji lub w module Application?

public function onBootstrap(EventInterface $Event) 
{ 
    $Config = $Event->getApplication()->getServiceManager()->get('Configuration'); 
    $SessionConfig = new SessionConfig(); 
    $SessionConfig->setOptions($Config['session']); 
    $SessionManager = new SessionManager($SessionConfig); 
    $SessionManager->start(); 
    Container::setDefaultManager($SessionManager); 
} 

Ten sam problem z metodą onBootstrap() klasy Module. Czy ten kod powinien zostać umieszczony w klasie modułu każdego modułu, czy tylko raz w klasie modułu aplikacji?

W obu przypadkach próbowałem obu podejść i próbowałem nawet wstawić ten kod do obu modułów jednocześnie, ale jedyną rzeczą, którą udało mi się dokonać było ustawienie zmiennych sesji w konstruktorze kontrolera, a następnie odczytanie ich w akcjach/metodach . Nie byłem w stanie ustawić zmiennej sesji w jednym działaniu/metodzie, a następnie odczytać ją w innym. Jeśli usunę linie, w których ustawiam zmienne w konstruktorze kontrolera, nie zobaczę tych zmiennych w sesji. Sesja zachowuje się tak, jakby była tworzona i usuwana za każdym razem, gdy strona jest żądana.

Czy brakuje mi czegoś? Proszę nie łączyć mnie z żadnymi zasobami w Internecie, przeczytałem je wszystkie i nie są one naprawdę pomocne.

Odpowiedz

14

Nie musisz wykonywać żadnej konfiguracji, aby używać sesji w Zend Framework 2. Oczywiście, możesz zmienić ustawienia, ale jeśli chcesz tylko zacząć pracę z sesjami, nie przejmuj się tym na razie .

Moje przeprosiny, ale zamierzam zlekceważyć twoje ostatnie zdanie; około miesiąca temu napisałem numer article about this subject w celu pokazania, jak szybko zacząć korzystać z sesji w ZF2. Nie ma rangi w wyszukiwarkach, więc prawdopodobnie nie przeczytałeś tego.

Oto fragment kodu pokazujący, jak można to zrobić. Jeśli jesteś zainteresowany tym, jak działa za kulisami, zapoznaj się z linkiem powyżej.

namespace MyApplication\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Session\Container; // We need this when using sessions 

class UserController extends AbstractActionController { 
    public function loginAction() { 
     // Store username in session 
     $userSession = new Container('user'); 
     $userSession->username = 'Andy0708'; 

     return $this->redirect()->toRoute('welcome'); 
    } 

    public function welcomeAction() { 
     // Retrieve username from session 
     $userSession = new Container('user'); 
     $username = $userSession->username; // $username now contains 'Andy0708' 
    } 
} 
+0

ta nie działa dla mnie. Czytałem twój artykuł wcześniej - powiedziałem, że przeczytałem wszystko w Internecie na ten temat. Mogę Ci również powiedzieć, że robisz '$ s = new Container (" User "); print_r ($ s); ' drukuje scaloną konfigurację wszystkich modułów w nieskończonej pętli while o.O – Zeimer

+0

Dziwne. Działa to dla mnie za pomocą aplikacji [Skeleton Application] (https://github.com/zendframework/ZendSkeletonApplication). Czy oparłeś swoją aplikację na tym? – Andy0708

+0

Tak, zrobiłem. Zmodyfikowałem go nieznacznie, zmieniając nazwę większości struktury folderów na CamelCase, jednak po wykonaniu tego nadal działał idealnie i byłem w stanie prawidłowo zaimplementować dla nich modele, kontrolery, widoki i testy jednostkowe - obejmuje to również operacje DB. Jedyne rzeczy, które nie działają dla mnie to sesje. Teraz sprawdzę, czy twój kod działa w niezmodyfikowanej aplikacji szkieletowej. – Zeimer

0

o sesji

Gdzie chcesz zapisać sesję (w mysql-db, w Mongo-db, lub w pamięci RAM, ..)? Jak klasyfikować sesji do "nazw" jak

$_SESSION["namespace"]["user"], 
$_SESSION["namespace_1"]["user"]? 

SessionManager

w Zend, Zend \ Session \ SessionManger pomóc zrobić wiele jak to, co wymieniono powyżej

prosty config dla SessionManger

$sessionManager = new SessionManager(); 
$sessionStorage = new SessionArrayStorage(); 
$sessionManager->setStorage($sessionStorage); 
//you can add more config, read document from Zend 
$sessionContainer = new Container("ABC", $sessionManager); 
$sessionContainer->offsetSet("user", "lehoanganh25991"); 

po wywołaniu nowego kontenera bez konfiguracji SessionManager

$sessionContainer = new Container("abc"); 

za scence, Zend utworzyć domyślną SessionManager, a następnie przekazać go do pojemnika

SessionArrayStorage, $ _SESSION

SessionArrayStorage w Zend może pracować z $ _SESSION, możemy uzyskać dostęp do user powyżej przez

$_SESSION["ABC"]["user"] 

jeśli ustawić inne magazyny jak mysql-db, Mongo-dB w pamięci RAM, .. dostęp przez $ _SESSION mogą nie działać

dostęp sesja

w module A, ustaw sesja

Jak możemy uzyskać dostęp to w Moudle B? gdzie $ sessionContainer variable @@?

to dość dziwne, ale gdy chcesz uzyskać dostęp do tego kontenera, tworzyć nowe z samej konfiguracji

$sessionManager = new SessionManager(); 
$sessionStorage = new SessionArrayStorage(); 
$sessionManager->setStorage($sessionStorage); 
$sessionContainer = new Container("ABC", $sessionManager); 
//access 
var_dump("get user from \$sessionContainer", $sessionContainer->offsetGet("user")); 

ocena demo na github: https://github.com/hoanganh25991/zend-auth-acl/tree/d0a501e73ac763d6ef503bbde325723ea1868351

(poprzez zobowiązuje projekt zmienił , dostęp do niego w tym drzewie)

in FronEnd\Controller\IndexController 
in AuthAcl\Module.php 
in AuthAcl\Service\SimpleAuth 
i acces same session at different places 
0
namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Zend\Session\Container; 

class IndexController extends AbstractActionController 
{ 
    // set session values 
    public function indexAction() 
    { 
     $session = new Container('User'); // name your session here by replacing User 
$user_session->offsetSet('user_name', "your user name"); // set your session user name 
$user_session->offsetSet('user_id', "1232"); //set your session user id 
    } 

// function to get values from session 
    public function getdataAction(){ 
    $session = new Container('User'); 
    $user_name= $user_session->offsetGet('user_name'); // get user name from the session 
    $user_id= $user_session->offsetGet('user_id'); // get user id from the session 
} 

// function to unset session values 
public function unsetdataAction(){ 
    $session = new Container('User'); 
    $user_session->offsetUnset('user_name'); // unset user name 
     $user_session->offsetUnset('user_id'); 
} 
}