Doctrine orm 在后加载中加载实体

Doctrine orm 在后加载中加载实体,doctrine-orm,Doctrine Orm,我有一个实体,它实现了加载后生命周期事件方法。此方法有条件地更新实体并尝试保存它。大致如下: /** * @PostLoad */ public function checkExpiryDate() { $currentDate = new App_Date(); // Check the expiry date here if($currentDate->getTimestamp() >

我有一个实体,它实现了加载后生命周期事件方法。此方法有条件地更新实体并尝试保存它。大致如下:

    /** 
     * @PostLoad 
     */
    public function checkExpiryDate()
    {
        $currentDate = new App_Date();

        // Check the expiry date here
        if($currentDate->getTimestamp() > $this->getDateExpired()->getTimestamp()) {
            $this->Status = "expired";
            $this->ServiceLayer->saveEntity($this);
        }
    }
但是,我收到以下错误:

Call to a member function fetch() on a non-object in Doctrine/ORM/Internal/Hydration/ObjectHydrator.php on line 149
似乎我无法在后期加载期间保存实体

我偶然发现了一个建议,它建议在新密钥下注册ObjectHyderator,并在任何新查询中指定Hyderator

然而,我想知道是否有一种很好的方法可以在更抽象的层次上实现这一点;每当在后加载分派期间生成查询时,我想自动注册一个新的ObjectOtherator

另外,有人能简要解释一下为什么这是一个问题吗?从我所看到的情况来看,一旦使用了hydrator,查询就会被删除,但我不明白为什么在构建新查询时会出现问题,即使hydrator被重用


谢谢你的指点

这是不受支持的,尤其是当您在服务层内调用
EntityManager
操作时

你会遇到每一种可能的奇怪的比赛状态,因为你基本上是在重复使用相同的补水剂,并破坏它们的内部状态,当它们还在为你的结果补水时,使它们变得无用

这是一个已知的问题,如果您真的需要在
@PostLoad
期间处理此初始化逻辑,则可以解决此问题。看


< >不要使用侦听器填充对象的缺少依赖关系,而是考虑在从实体管理器中取出对象之后,使用服务层处理该对象。无论如何,这将禁止您为您的示例中的实体拥有任何代理。

感谢您与我澄清这一点。我还没有考虑到这对我的代理人的影响。我会听从你的建议,而不是在取回后关闭水合器,而是在取回后触发我自己的事件来管理这样的检查。问题已经解决的事实是否意味着现在可以在后加载事件中使用entitymanager进行保存,或者这是一个非常糟糕的主意。我有在postLoad时触发的业务规则,如果一个实体处于特定状态,我希望将一个项添加到它的一个集合中并将其持久化。事实上,这是可行的,但当我使用时,我得到一个异常“不能从空数据结构中弹出”。我还发现这篇文章是半相关的,所以将它添加到这里。