我正在使用Symfony 2编写一个小型电子商店应用程序,我需要一些方法将用户的购物车存储在会话中。我认为使用数据库并不是一个好主意。
应用程序将使用产品,类别, ShoppingCart 等实体,其中产品和类别会持久保存到数据库中,用户将选择产品进入他们的ShoppingCart。
我找到了 NativeSessionStorage 类,它应该将实体保存到会话中。但是没有书面的实施过程。
我是在控制器中还是在分开的类ShoppingCart中使用它?你能给我一个NativeSessionStorage
用法的简短例子吗?
修改 问题设置不正确:
目标不是将所有产品ID保存到cookie中。目标是仅在服务器端的应用程序内存中保存篮子(填充产品)的引用,并为用户分配适当的篮子。这甚至可以在PHP中执行此操作吗?
EDIT2 :
使用服务是更好的解决方案吗?
答案 0 :(得分:21)
不知道这种方式是否是临时存储数据的更好方法。您可以使用它来实例化会话对象:
$session = $this->get("session");
不要忘记控制器中的“使用”:
use Symfony\Component\HttpFoundation\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
答案 1 :(得分:14)
您可以创建实体Serializable并序列化实体对象并保存到会话,然后使用unserialize()
在其他页面中检索。有一点需要注意,对于db Doctrine2中存在的实体,将检索/未序列化的实体标记为已分离。在这种情况下,您必须致电$em->merge($entity);
。
答案 2 :(得分:5)
您可以将整个对象保存到Symfony的会话中。只需使用(在控制器中):
$this->get('session')->set('session_name', $object);
注意:对象需要可序列化。否则,在start_session()函数上加载会话时PHP会崩溃。
只需通过添加serialize()和unserialize()方法来实现\ Serializable接口,如下所示:
public function serialize()
{
return serialize(
[
$this->property1,
$this->property2,
]
);
}
public function unserialize($serialized)
{
$data = unserialize($serialized);
list(
$this->property1,
$this->property2,
) = $data;
}
来源: http://blog.ikvasnica.com/entry/storing-objects-into-a-session-in-symfony(关于此主题的博文)