Intereting Posts
Почему стандартное время сеанса 24 минуты (1440 секунд)? MAMP / Symfony: MAMP переопределяет параметр date.timezone от php.ini, Symfony не работает Необходимо загрузить файлы в документы Google из моего приложения и сохранить ссылку на загруженный файл PHP – Сортировка многомерного массива другим массивом Посещения журнала в общей памяти Кодирование / экранирование управляющих символов JSON как сделать поле ввода даты больше или равно другому полю даты, используя валидацию в laravel Рассчитайте разницу во времени между двумя датами и представите ответ типа «2 дня 3 часа назад» Подтвердить, являются ли данные формы текущей выборкой ввода Magento – показать пользовательские атрибуты в таблице Grouped Product Идентификатор видео Vimeo YouTube из встроенного кода или URL-адреса с регулярным выражением PHP RegEx simplexml, возвращая несколько элементов с тем же тегом Почему crontab не выполняет мой PHP-скрипт? Как создать PDF из HTML с помощью классов начальной загрузки CSS Масштабирование HTML из расшифрованных PDF-файлов

Symfony2 сериализует объект объекта на сеанс

Я хочу сохранить один из объектов объекта в сессии, но по мере того, как я это делаю, я получаю следующие две ошибки:

Исключение: Symfony \ Bundle \ FrameworkBundle \ DataCollector \ RequestDataCollector :: serialize () должен возвращать строку или NULL

а также

ErrorException: Примечание: serialize (): «id» возвращается как переменная-член из __sleep (), но не существует в / var / www / clients / client71 / web256 / web / _dev_fd / kkupon / vendor / symfony / src / Symfony / Component /HttpKernel/DataCollector/DataCollector.php строка 29

Мой код выглядит следующим образом:

$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id); $request->getSession()->set('offer', $offer); 

Как я понял?

Спасибо.

ОБНОВЛЕНИЕ С помощью Rowgm я могу исправить эту проблему, установив свойства protected вместо private. Единственная проблема, с которой я столкнулся, – это прочесть объект из сеанса, который EntityManager не знает об этом, и если я добавлю объект (из сеанса) на другой объект (между ними есть отношения OneToMany), это не сработает.

 <?php $offer = $this->get('session')->get('offer'); $coupon = new Coupon(); $coupon->setOffer($offer); $this->em->persist($coupon); $this->em->flush(); 

Это вызывает ошибку, потому что купон имеет свойство объекта, которое в соответствии с EntityManager не находится в базе данных (фактически это находится в БД, я помещаю в сеанс из БД).

 <?php $offer = $this->get('session')->get('offer'); echo $this->em->getUnitOfWork()->isInIdentityMap($offer) ? "yes":"no"; //result: no 

Одним из решений может быть: $offer = $this->em->merge($offer);

Но это, похоже, не лучшее. Я хочу, чтобы мой EntityManager воспринимал объекты сущности, хранящиеся в сеансе, не сообщая об этом каждый раз. Есть идеи?

Вы можете сериализовать любой объект, установив все свои свойства и отношения от частного к защищенному .

У вас может быть общая проблема с symfony2 , даже если вы установили все свойства для защиты: вам нужно повторно создать прокси из тех объектов, которые вы изменили. Для этого просто очистите кеш. Для защиты окружающей среды :

app/console cache:clear

Он работает, даже если «он содержит много посторонних объектов и даже ArrayCollections из иностранных объектов», как вы сказали.

Сериализация объектов не рекомендуется, как вы можете видеть в документации Doctrine . Вы должны реализовать интерфейс Serializable и сериализовать / десериализовать данные сущности вручную.

Вы можете исключить поля невозмутимости, переопределив метод __sleep :

 public function __sleep() { // these are field names to be serialized, others will be excluded // but note that you have to fill other field values by your own return array('id', 'username', 'password', 'salt'); }