2012-09-05 10 views
12

Ich versuche zu verwenden Symfony2 sessions.I tun, um dieseWie Session Namensräume in Symfony2

$session = $this->getRequest()->getSession(); 
    $session->set('token','value'); 

Dies funktioniert verwenden. Aber ich möchte Namespace in Sitzung verwenden. Dokumentation sagt

class NamespacedAttributeBag 

bietet dieses Feature, aber ich kann nicht herausfinden, wie es zu implementieren

Antwort

14

Öffnen Sie einfach config.yml neu definiert und nach der Einfuhr hinzufügen:

parameters: 
    session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag 

Es sieht wie folgt aus:

imports: 
    - { resource: parameters.yml } 
    - { resource: security.yml } 

parameters: 
    session.attribute_bag.class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag 

framework: 
# ... 
+1

FYI: das wird nicht in Symfony 3 funktionieren, da sie alle diese Klassenparameter herausgerissen haben. –

8

Sie sollten Sitzungsdienst neu zu definieren und auch Service für Ihr Attribut Tasche definieren (wenn Sie Standardimplementierung von session.attribute_bag überprüfen werden Sie‘ Ich sehe, dass dieser Dienst nur Klassenattribut hat).

Und Ihre neuen Service injizieren Sitzungsdienst in dort

services: 
    session: 
     class: Symfony\Component\HttpFoundation\Session\Session 
     arguments: 
      - @session.storage 
      - @your.session.attribute_bag #service id is defined below 
      - @session.flash_bag 

    your.session.attribute_bag: 
     class: Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag 
+0

vielen Dank. Es war wirklich hilfreich – aditya

+3

wow - die Docs sollten die NamespacedAttributeBag nicht einmal erwähnen, ohne näher darauf einzugehen, wie man sie benutzt. nachdem ich meinen Kopf gegen $ session-> registerBag() geschlagen habe, bin ich froh, diese Lösung zu finden! – Casey

+1

Das hat viel geholfen, aber warum ist das Attribut nicht konsistent. Ich habe einige Eigenschaften und nächste Funktionsaufruf sie sind zurück auf den Standard? – gprusiiski

3

Da es auch möglich ist, die HTTPFoundation-Komponente außerhalb von Symfony2 zu verwenden, ist der Weg t o implementieren NamespacedUserBags ist wie folgt:

use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag; 

$session = new Session(); 

//first bag 
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_1>'); 
$myAttributeBag->setName('<your_tag_name_1>'); 
$session->registerBag($myAttributeBag); 

//second bag 
$myAttributeBag = new NamespacedAttributeBag('<your_storage_key_2>'); 
$myAttributeBag->setName('<your_tag_name_2>'); 
$session->registerBag($myAttributeBag); 

$session->start(); 

Register wie viele Taschen, wie Sie wollen, aber stellen Sie sicher, dies zu tun, bevor Sie die Sitzung starten. Jetzt können Sie wechseln zwischen den Beuteln mit getBag():

$activeBag = $session->getBag('<your_tag_name>'); 

und Zugriff auf die Namespace-Tasche mit den typischen Methoden:

$activeBag->set('tokens/a', 'adsf82983asd'); 
$activeBag->set('tokens/b', 'daslfl232l3k'); 

print_r($activeBag->get('tokens')); 
Verwandte Themen