在会话中存储对象 Symfony 2

Posted

技术标签:

【中文标题】在会话中存储对象 Symfony 2【英文标题】:Store objects in sessions Symfony 2 【发布时间】:2012-06-16 12:36:25 【问题描述】:

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

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

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

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

编辑: 问题设置不正确:

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

EDIT2

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

【问题讨论】:

这通常是个坏主意,因为存储空间非常有限,您无法知道存储是否成功。我宁愿将它保存到临时表或数据库中,可能使用 redis 或 mongodb 之类的东西,然后在会话中存储购物车的密钥。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

$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

【讨论】:

这里只说明如何使用会话服务。由于问题指定实体实例需要存储在会话中,下面的 Mun Mun Das 和 Ivan Kvasnica 的答案也需要使用,其中存储的实体可以序列化。【参考方案3】:

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

【讨论】:

以上是关于在会话中存储对象 Symfony 2的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2:会话和存储之间的区别?

Symfony2 将实体对象序列化为会话

Symfony 2 - 在单元测试期间将会话数据添加到请求对象

symfony 3.3中的单个会话实现

应用引擎上的 Symfony3 会话失败

Symfony2 会话和缓存:清除命令