Symfony2 сериализует объект сущности в сеанс - PullRequest
9 голосов
/ 22 февраля 2012

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

Исключение: 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

10111012 * Мой код выглядит так:
$offer = $this->getEntityManager()->getRepository('KkuponMainBundle:Offer')->find($offer_id);
$request->getSession()->set('offer', $offer);

Как я могу сделать это правильно?

Спасибо.

ОБНОВЛЕНИЕ С помощью Rowgm яможет решить эту проблему, установив свойства, защищенные, а не частные.Единственная проблема, с которой я столкнулся, - это чтение сущности из сеанса, о котором 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 воспринимал объекты сущностей, хранящиеся в сеансе, не сообщая об этом каждый раз.Есть идеи?

Ответы [ 3 ]

14 голосов
/ 04 апреля 2012

Вы можете сериализовать любую сущность, установив все их свойства и отношения от private до protected .

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

app/console cache:clear

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

6 голосов
/ 22 февраля 2012

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

2 голосов
/ 02 октября 2013

Вы можете исключить неосновные поля, переопределив __ 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');
}
...