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