php – Symfony2将实体对象序列化为会话

前端之家收集整理的这篇文章主要介绍了php – Symfony2将实体对象序列化为会话前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将一个实体对象保存到会话中,但正如我所做的那样,我得到以下两个错误

Exception:
Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector::serialize()
must return a string or NULL

ErrorException: Notice: serialize(): “id” returned as member
variable from __sleep() but does not exist in
/var/www/clients/client71/web256/web/_dev_fd/kkupon/vendor/symfony/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.PHP
line 29

我的代码如下:

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

我该如何得到它正确?

谢谢.

UPDATE
通过Rowgm的帮助,我可以通过设置属性而不是私有来解决这个问题.唯一的问题是从EntityManager不知道的会话中读取实体后,如果我将对象(从会话)添加到另一个对象(它们之间有OneToMany关系),它将不起作用.

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

这引发了一个错误,因为优惠券有一个对象属性,根据EntityManager不在数据库中(实际上是在DB中,我将数据库放在会话中).

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

一个解决方案可以是:
$offer = $this-> em-> merge($offer);

但这似乎不是最好的一个.我希望我的EntityManager能够感知存储在会话中的实体对象,而不是每次都通知它.
任何想法?

您可以通过将其所有属性和关系从private设置为protected来序列化任何实体.

即使将所有属性设置为protected,您也可能遇到symfony2的常见问题:您必须重新生成已更改的实体的代理.为此,只需清除缓存.对于开发环境:

app / console cache:clear

即使它说“它包含很多异物,甚至包含外来实体的ArrayCollections”,它也可以工作.

原文链接:https://www.f2er.com/php/130899.html

猜你在找的PHP相关文章