Хранить объекты в сеансах Symfony 2

Я пишу небольшое приложение для электронных магазинов с Symfony 2, и мне нужно каким-то образом хранить корзину пользователя в сеансе. Я думаю, что использование базы данных не является хорошей идеей.

В приложении будут использоваться объекты, такие как Продукт, Категория, ShoppingCart, где Продукт и Категория сохраняются в базе данных, и пользователи будут выбирать продукты в свою ShoppingCart.

Я нашел класс NativeSessionStorage, который должен сохранить объект в сеансе. Но в приложении нет письменного процесса внедрения.

Я использую это в контроллере или в отдельном классе ShoppingCart? Не могли бы вы привести короткий пример использования NativeSessionStorage?

EDIT: Вопрос задан неправильно:

Цель состоит не в том, чтобы сохранить все идентификаторы продуктов в файл cookie. Цель состоит в том, чтобы сохранить только ссылку на корзину (заполненную продуктами) в памяти приложения на стороне сервера и присвоить пользователю правильную корзину. Возможно ли это сделать в PHP?

EDIT2

Является лучшим решением для использования службы?

Ответ 1

Не знаю, является ли этот способ лучшим способом хранения ваших данных. Вы можете использовать это для создания объекта сеанса:

$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.

Кроме того, взгляните на другие способы хранения ваших данных: Несколько SessionStorage

Ответ 2

Вы можете сделать свой объект Serializable и сериализовать объект сущности и сохранить его на сеанс, а затем получить на другой странице с помощью unserialize(). Существует одно предостережение, поскольку сущность, существующая в db Doctrine2, будет отмечать извлеченный/несертифицированный объект как отдельный. Вы должны вызвать $em->merge($entity); в этом случае.

Ответ 3

Вы можете сохранить весь объект в сеансе с помощью 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 (мой блогпост на эту тему)