2012-06-13 39 views
11

Symfony 2 ile küçük bir e-shop uygulaması yazıyorum ve kullanıcının alışveriş sepetini bir oturumda saklamanın bir yoluna ihtiyacım var. Bir veritabanı kullanmanın iyi bir fikir olmadığını düşünüyorum. Ürün, Ürün ve Kategori veritabanı ve kullanıcı haline devam edilir Kategori, shoppingcart gibi varlıkları kullanacakOturumları nesnelerde saklayın Symfony 2

uygulama onların shoppingcart içine ürünleri seçerek edilecektir.

Bir oturumu bir oturumda kaydetmesi beklenen NativeSessionStorage sınıfını buldum. Ancak bir uygulamaya yazılı bir uygulama süreci yoktur.

Bunu, denetleyicide mi yoksa ayrı bir ClassCart sınıfında mı kullanırım? Bana NativeSessionStorage kullanımının kısa bir örneğini verebilir misiniz?

DÜZENLEME: soru doğru ayarlanmış değildi:

gol bir çerez içine tüm ürün kimlikleri kurtarmaya değil. Amaç, sunucu tarafında uygulama belleğinde sadece sepet için bir başvuru (ürünle doldurulmuş) kaydetmek ve kullanıcıya uygun sepeti atamaktır. Bunu PHP'de yapmak bile mümkün mü?

EDIT2:

bir hizmeti kullanmak için daha iyi bir çözüm var mı?

+0

çünkü depolama çok sınırlıdır ve depolamanın başarılı olup olmadığını bilmenin bir yolu yoktur. Bunu geçici bir tabloya veya veritabanına kaydetmeyi tercih ederim, belki de redis veya mongodb gibi bir şeyi kullanarak ve sadece oturumda alışveriş sepetine bir anahtar saklamak istiyorum. – Sgoettschkes

cevap

20

Bu şekilde, verilerinizi geçici olarak depolamanın daha iyi bir yolu olup olmadığını bilmiyorum. Bir ayarlamak istediğiniz zaman, oturum otomatik olarak başlar Sonra

use Symfony\Component\HttpFoundation\Session; 

:

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

controller içerisinde 'kullanım' Unutma: Bir oturum nesnesi örneğini için kullanabilir değişken gibi: $session->set("product name","computer");

Bu

Session sınıf, kolay kullanımı dayanmaktadır anlamak. Yaygın tanımlar: Multiple SessionStorage

+0

Bu yalnızca oturum hizmetinin nasıl kullanılacağını açıklar. Soru olarak, oturum örneklerinin oturumda saklanması gerektiğini, Mun Mun Das ve Ivan Kvasnica'nın aşağıdaki cevapları, saklanan varlıkları seri hale getirebilecekleri şekilde kullanmaları gerekmektedir. – Adambean

14

Sen varlık Serializable yapmak ve taraf nesne seri ve oturuma kaydedebilir ve daha sonra diğer sayfada almak:

Ayrıca
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. 

, verilerinizi depolamak için başka yollar için bir göz atın unserialize() kullanıyor. Db Doktrini2'de var olan bir varlık için, geri alınan/sınıflandırılmamış varlığı müstakil olarak işaretleyeceği bir uyarı vardır. Bu durumda $em->merge($entity);'u aramanız gerekiyor.

5

Tüm nesneyi Symfony ile bir oturuma kaydedebilirsiniz. Sadece (bir denetleyici olarak) kullanın:

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

Dikkat: nesne seri hale getirilebilir olması gerekir. Aksi takdirde, oturum start_session() işlevine yüklenirken PHP çöküyor.

Bunun gibi, serialize() ve unserialize() yöntemi ekleyerek \ Serializable arayüzü uygulamak:

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

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

Kaynak: Genellikle bir kötühttp://blog.ikvasnica.com/entry/storing-objects-into-a-session-in-symfony (Bu konuyla ilgili benim blog gönderisi)