2012-06-13 89 views
11

我正在用Symfony 2編寫一個小型電子商店應用程序,我需要某種方式在會話中存儲用戶的購物車。我認爲使用數據庫不是一個好主意。在會話中存儲對象Symfony 2

的應用程序將使用的東西,例如產品類別我的購物其中產品和類別都持續到數據庫,用戶將選擇的產品進入他們的購物。

我發現NativeSessionStorage應該將實體保存到會話中的類。但是沒有書面的應用程序實現過程。

我是否在控制器或分離的類ShoppingCart中使用它?你能給我一個NativeSessionStorage用法的簡短例子嗎?

編輯: 問題設置不正確:

的目標不是所有的產品ID保存到一個cookie。目標是僅在服務器端的應用程序內存中保存一籃子(裝滿產品)的參考,併爲用戶分配適當的籃子。這甚至有可能在PHP中做到這一點?

EDIT2

是一個更好的解決方案使用服務?

+0

這通常是一個壞因爲存儲非常有限,你無法知道存儲是否成功。我寧願將它保存到一個臨時表或數據庫中,也許使用類似redis或mongodb的東西,並在會話中存儲購物車的密鑰。 – Sgoettschkes

回答

20

不知道這種方式是否是暫時存儲數據的更好方法。當你想設置一個

use Symfony\Component\HttpFoundation\Session; 

然後,會話自動啓動:你可以用它來實例化一個會話對象:

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

不要忘了在你的控制器「使用」變量,如:

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

這是基於使用的Session類,容易瞭解。一般定義:

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. 

而且,看看其他的方式來存儲你的數據:Multiple SessionStorage

+0

這隻解釋瞭如何使用會話服務。由於該問題指出需要將實體實例存儲在會話中,因此Mun Mun Das和Ivan Kvasnica在下面的答案中存儲的實體可序列化,因此也需要使用。 – Adambean

14

你可以讓你的實體Serializable和序列化實體對象並保存到會話,然後在其他網頁檢索使用unserialize()。有一個警告,因爲存在於db Doctrine2中的實體會將檢索/非序列化的實體標記爲分離的。在這種情況下,您必須致電$em->merge($entity);

5

您可以將整個對象保存到與Symfony的會話中。只是(在控制器中)使用:

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

當心:對象需要可序列化。否則,在start_session()函數中加載會話時,PHP會崩潰。

通過添加序列化()和反序列化()方法,這樣就實現\ Serializable接口:

​​

來源:​​(我對這個主題的博文)