2012-06-13 25 views
11

Tôi đang viết một ứng dụng e-shop nhỏ với Symfony 2 và tôi cần một số cách để lưu trữ giỏ hàng của người dùng trong một phiên. Tôi nghĩ rằng việc sử dụng một cơ sở dữ liệu không phải là một ý tưởng hay.Lưu trữ các đối tượng trong phiên làm việc Symfony 2

Các ứng dụng sẽ sử dụng các tổ chức như sản phẩm, Thể loại, Giỏ hàng nơi sản phẩm và loại được tiếp tục tồn vào cơ sở dữ liệu và người dùng sẽ được lựa chọn sản phẩm vào Giỏ hàng của họ.

Tôi đã tìm thấy NativeSessionStorage lớp được cho là lưu một thực thể vào một phiên. Nhưng không có quy trình thực hiện bằng văn bản nào vào một ứng dụng.

Tôi có sử dụng điều này trong bộ điều khiển hoặc trong một lớp riêng biệt ShoppingCart không? Bạn có thể cho tôi một ví dụ ngắn về việc sử dụng NativeSessionStorage không?

EDIT: Câu hỏi đặt ra là không được đặt đúng:

Mục tiêu không phải là để lưu tất cả các id sản phẩm vào một cookie. Mục đích là để chỉ lưu một tham chiếu cho giỏ (chứa đầy các sản phẩm) trong bộ nhớ ứng dụng trên phía máy chủ và gán giỏ thích hợp cho người dùng. Điều này thậm chí có thể làm điều này trong PHP?

EDIT2:

Là một giải pháp tốt hơn để sử dụng một dịch vụ?

+0

Nó thường là một xấu ý tưởng bởi vì lưu trữ rất hạn chế và bạn không có cách nào để biết nếu lưu trữ nó thành công. Tôi muốn lưu nó vào một bảng tạm thời hoặc cơ sở dữ liệu, có thể sử dụng một cái gì đó như redis hoặc mongodb và chỉ cần lưu trữ một khóa vào giỏ mua hàng trong phiên. – Sgoettschkes

Trả lời

20

Không biết nếu cách này là cách tốt hơn để lưu trữ dữ liệu của bạn tạm thời. Bạn có thể sử dụng để tạo một đối tượng session:

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

Đừng quên 'sử dụng' trong điều khiển của bạn:

use Symfony\Component\HttpFoundation\Session; 

Sau đó, phiên giao dịch bắt đầu tự động khi bạn muốn thiết lập một biến như:

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

này được dựa trên việc sử dụng các Session lớp, dễ dàng hiểu. Thường định nghĩa:

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. 

Ngoài ra, có một cái nhìn vào những cách khác để lưu trữ dữ liệu của bạn: Multiple SessionStorage

+0

Điều này chỉ giải thích cách sử dụng dịch vụ phiên. Theo câu hỏi quy định rằng các thể hiện thực thể cần phải được lưu trữ trong phiên các câu trả lời của Mun Mun Das và Ivan Kvasnica bên dưới, theo đó các thực thể được lưu trữ được thực hiện tuần tự, cũng cần phải được sử dụng. – Adambean

14

Bạn có thể làm cho tổ chức của bạn Serializable và serialize các đối tượng tổ chức và lưu vào phiên và sau đó lấy ở trang khác sử dụng unserialize(). Có một cảnh báo trước, đối với một thực thể tồn tại trong db Doctrine2 sẽ đánh dấu thực thể được truy xuất/unserialized là tách ra. Bạn phải gọi $em->merge($entity); trong trường hợp này.

5

Bạn có thể lưu toàn bộ đối tượng vào một phiên với Symfony. Chỉ cần sử dụng (trong một bộ điều khiển):

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

Hãy coi chừng: đối tượng cần phải được serializable. Nếu không, PHP bị treo khi tải phiên làm việc trên hàm start_session().

Chỉ cần thực hiện các giao diện \ Serializable bằng cách thêm serialize() và phương pháp unserialize(), như thế này:

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

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

Nguồn:http://blog.ikvasnica.com/entry/storing-objects-into-a-session-in-symfony (blogpost của tôi về chủ đề này)

Các vấn đề liên quan