Я хочу сохранить один из объектов объекта в сессии, но по мере того, как я это делаю, я получаю следующие две ошибки:
Исключение: Symfony \ Bundle \ FrameworkBundle \ DataCollector \ RequestDataCollector :: serialize () должен возвращать строку или NULL
- Как использовать мои сущности и сущности в команде Symfony 2 Console?
- Symfony 2 ACL и иерархия ролей
- Symfony2: языковой стандарт по умолчанию не применяется в переводе
- Symfony2 FOSUserBundle, расширяющая регистрационную форму, вызывает дублирование электронной почты для подтверждения
- Исключить некоторые атрибуты из реляционного объекта RestBundle Symfony2
а также
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'); }