2012-06-13 14 views
11

Ich schreibe eine kleine E-Shop-Anwendung mit Symfony 2 und ich brauche eine Möglichkeit, den Einkaufswagen des Benutzers in einer Sitzung zu speichern. Ich denke, die Verwendung einer Datenbank ist keine gute Idee.Speichern von Objekten in Sitzungen Symfony 2

Die Anwendung wird Entitäten verwenden wie Produkt, Kategorie, ShoppingCart wo Produkt- und Kategorie beharren in die Datenbank und Benutzer werden Produkte in ihre ShoppingCart werden wählen.

Ich habe gefunden NativeSessionStorage Klasse, die eine Entität in einer Sitzung speichern soll. Aber es gibt keinen schriftlichen Prozess der Implementierung in eine Anwendung.

Benutze ich dies in der Steuerung oder in einer separaten Klasse ShoppingCart? Könnten Sie mir ein kurzes Beispiel für NativeSessionStorage Nutzung geben?

EDIT: Die Frage ist nicht korrekt eingestellt wurde:

Das Ziel ist nicht alle Produkt-IDs in einem Cookie zu speichern. Ziel ist es, nur eine Referenz für den Warenkorb (gefüllt mit Produkten) im Anwendungsspeicher auf der Serverseite zu speichern und dem Benutzer den richtigen Warenkorb zuzuordnen. Ist dies in PHP überhaupt möglich?

EDIT2:

eine bessere Lösung ist eine Dienstleistung in Anspruch?

+0

Es ist generell eine schlechte Idee, weil der Speicher sehr begrenzt ist und Sie nicht wissen können, ob das Speichern erfolgreich war. Ich würde es lieber in einer temporären Tabelle oder Datenbank speichern, vielleicht etwas wie redis oder mongodb verwenden und einfach einen Schlüssel in den Einkaufswagen in der Sitzung speichern. – Sgoettschkes

Antwort

20

Ich weiß nicht, ob dies der beste Weg ist, um Ihre Daten vorübergehend zu speichern. Sie können diese verwenden, um eine Session-Objekt zu instanziiert:

$session = $this->get("session");

Sie die ‚Verwendung‘ in Ihrem Controller nicht vergessen:

use Symfony\Component\HttpFoundation\Session; 

Dann wird die Sitzung startet automatisch, wenn Sie ein festlegen möchten Variable wie:

$session->set("product name","computer");

er auf der Verwendung der Session Klasse, einfach basiert verstehen. Gemeinhin Definitionen:

get(string $name, mixed $default = null) 

Returns an attribute. 

set(string $name, mixed $value) 

Sets an attribute. 

has(string $name) 

Checks if an attribute is defined. 

auch einen Blick auf die anderen Möglichkeiten, um Ihre Daten zu speichern: Multiple SessionStorage

+0

Dies erklärt nur, wie der Sitzungsdienst verwendet wird. Da bei der Frage angegeben wurde, dass Entitätsinstanzen in der Sitzung gespeichert werden sollen, müssen die Antworten von Mun Mun Das und Ivan Kvasnica unten, wobei die gespeicherten Entitäten serialisierbar gemacht werden, ebenfalls verwendet werden. – Adambean

14

Sie können Ihr Unternehmen Serializable und serialisiert die Entitätsobjekt und speichern zu Sitzung und dann abzurufen, in anderer Seite machen mit unserialize(). Es gibt einen Vorbehalt, denn eine Entität, die in der Datenbank Doctrine2 vorhanden ist, markiert die abgerufene/unsialisierte Entität als getrennt. Sie müssen in diesem Fall $em->merge($entity); anrufen.

5

Sie können das gesamte Objekt in einer Sitzung mit Symfony speichern. Verwenden Sie einfach (in einem Controller):

$this->get('session')->set('session_name', $object); 

Vorsicht: das Objekt muss serialisierbar sein. Andernfalls stürzt PHP beim Laden der Sitzung in der Funktion start_session() ab.

implementieren Sie einfach die \ Serializable Schnittstelle von serialize Zugabe() und unserialize() -Methode wie folgt aus:

public function serialize() 
    { 
    return serialize(
     [ 
     $this->property1, 
     $this->property2, 
     ] 
    ); 
    } 

    public function unserialize($serialized) 
    { 
    $data = unserialize($serialized); 
    list(
     $this->property1, 
     $this->property2, 
    ) = $data; 
    } 

Quelle:http://blog.ikvasnica.com/entry/storing-objects-into-a-session-in-symfony (mein Blogpost zu diesem Thema)