【问题标题】:Doctrine 2: Can entities be saved into sessions?原则 2:实体可以保存到会话中吗?
【发布时间】:2011-09-19 15:11:55
【问题描述】:

我在将实体保存到 PHP 会话后遇到延迟加载问题。有什么解决方法吗?

【问题讨论】:

    标签: php doctrine doctrine-orm


    【解决方案1】:

    请参阅教义手册中的Serializing Entities:(您在会话中保存的所有内容都会被序列化和反序列化。)

    序列化实体可能会出现问题,因此并不真正推荐,至少只要实体实例仍持有对代理对象的引用或仍由 EntityManager 管理,则不会。

    有一个技术限制是在代理实体时避免私有属性被序列化(延迟加载的实体被代理)。

    这意味着您必须避免为要序列化的实体使用private 属性(改用protected 实体)。

    此外,如果延迟加载的实体在序列化时未加载,则在反序列化后将无法加载。因此,您必须确保实体在序列化之前已完全加载。

    【讨论】:

    • 谢谢 Arnaud,这很有意义!是否有完全加载实体的特定方法(仅针对这一实例)?
    • 克隆它似乎是一个好方法;这也删除了对实体持久性等的引用,您也必须这样做。
    • Arnaud,克隆如何解决这个问题?被克隆的对象不会还有对代理的引用吗?
    • 代理有一个__clone 方法来确保实体被加载,并移除对实体持久化器的引用。 __clone 由 PHP 在克隆上调用,就在克隆之后。
    • Arnaud,非常感谢您的帮助!最后一个问题,如果不移除实体持久化器会怎样?
    【解决方案2】:

    接受的答案准确地引用了 Doctrine 文档。

    但是,关于如何序列化实体并将它们存储在会话中的主题的页面很少。 Entities in the Session 表示实体在存储到会话之前必须分离,然后在从会话中恢复时合并。

    On this page 有关于detachingmerging 实体的部分。

    保存:

    $em = GetEntityManager();
    $user = $em->find("User", 1);
    $em->detach($user);
    $_SESSION['user'] = $user;
    

    恢复:

    $em = GetEntityManager();
    session_start();
    if (isset($_SESSION['user']) && $_SESSION['user'] instanceof User) {
        $user = $_SESSION['user'];
        $user = $em->merge($user);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-17
      • 2015-01-18
      • 1970-01-01
      • 2016-08-05
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 2011-08-09
      相关资源
      最近更新 更多