加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 14:10:08 所属栏目:PHP教程 来源:网络整理
导读:我想将一个实体对象保存到会话中,但正如我所做的那样,我得到以下两个错误: Exception: SymfonyBundleFrameworkBundleDataCollectorRequestDataCollector::serialize() must return a string or NULL 和 ErrorException: Notice: serialize(): “id” re
我想将一个实体对象保存到会话中,但正如我所做的那样,我得到以下两个错误:

Exception:
SymfonyBundleFrameworkBundleDataCollectorRequestDataCollector::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”,它也可以工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读