13

我正在使用 Symfony 2 编写一个小型电子商店应用程序,我需要一些方法将用户的购物车存储在会话中。我认为使用数据库不是一个好主意。

该应用程序将使用ProductCategoryShoppingCart等实体,其中 Product 和 Category 被持久化到数据库中,用户将在他们的 ShoppingCart 中选择产品。

我找到了 NativeSessionStorage类,它应该将实体保存到会话中。但是在应用程序中没有实现的书面过程。

我是在控制器中使用它还是在单独的类 ShoppingCart 中使用它?你能给我一个简短的NativeSessionStorage用法示例吗?

编辑: 问题设置不正确:

目标不是将所有产品 ID 保存到 cookie 中。目标是在服务器端的应用程序内存中仅保存篮子(装满产品)的引用,并为用户分配适当的篮子。这甚至可以在 PHP 中做到这一点吗?

编辑2

使用服务是否有更好的解决方案?

4

3 回答 3

23

不知道这种方式是否是临时存储数据的更好方法。您可以使用它来实例化会话对象:

$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

于 2012-06-13T14:26:11.193 回答
14

您可以使您的实体可序列化并序列化实体对象并保存到会话,然后使用unserialize(). 有一个警告,因为 db Doctrine2 中存在的实体会将检索到的/未序列化的实体标记为分离的。$em->merge($entity);在这种情况下你必须打电话。

于 2012-06-13T14:33:06.190 回答
6

您可以使用 Symfony 将整个对象保存到会话中。只需使用(在控制器中):

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

注意:对象需要可序列化。start_session()否则,在函数上加载会话时 PHP 会崩溃。

只需\Serializable通过添加serialize()unserialize()方法来实现接口,如下所示:

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 (我关于这个主题的博文)

于 2016-11-12T16:45:03.070 回答