在Symfony 2会话中存储对象

Ale*_*leš 12 php session symfony

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

该应用程序将使用Product,Category,ShoppingCart等实体,其中Product和Category持久保存到数据库中,用户将在ShoppingCart中选择产品.

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

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

编辑: 问题设置不正确:

目标不是将所有产品ID保存到cookie中.目标是仅在服务器端的应用程序内存中保存篮子(填充产品)的引用,并为用户分配适当的篮子.这甚至可以在PHP中执行此操作吗?

编辑2:

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

Sen*_*nse 22

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

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

不要忘记控制器中的"使用":

use Symfony\Component\HttpFoundation\Session;
Run Code Online (Sandbox Code Playgroud)

然后,当您要设置如下变量时会话自动启动:

$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.
Run Code Online (Sandbox Code Playgroud)

另外,请查看存储数据的其他方法:多个SessionStorage


Mun*_*Das 14

您可以使您的实体Serializable并序列化实体对象并保存到会话,然后使用其他页面检索unserialize().有一点需要注意,对于db Doctrine2中存在的实体,将检索/未序列化的实体标记为已分离.你必须$em->merge($entity);在这种情况下打电话.


Iva*_*ica 5

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

$this->get('session')->set('session_name', $object);
Run Code Online (Sandbox Code Playgroud)

注意:对象需要可序列化.否则,在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;
  }
Run Code Online (Sandbox Code Playgroud)

资料来源: http ://blog.ikvasnica.com/entry/storing-objects-into-a-session-in-symfony(关于此主题的博文)