2

我有一个实现 postLoad 生命周期事件方法的实体。此方法有条件地更新实体并尝试保存它。类似于以下内容:

    /** 
     * @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

看来我无法在 postLoad 期间保存实体。

我偶然发现了这张票,它建议在新密钥下注册 ObjectHydrator 并在任何新查询期间指定水合器。

但是,我想知道是否有一种在更抽象的层次上实现它的好方法;每当在 postLoad 调度期间构建查询时,我想自动注册一个新的 ObjectHydrator。

此外,有人可以首先简要解释为什么这是一个问题吗?从我可以看到,一旦使用了水合器,查询就会被删除,但我不明白为什么在构建新查询时这会成为问题,即使水合器被重用。

感谢您的任何指点!

4

1 回答 1

7

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

你会遇到每一种可能的奇怪竞争条件,因为你基本上是在重复使用相同的水合器并破坏它们的内部状态,当它们仍在为你的结果集水合时使它们变得无用。

这是一个已知问题,如果您确实需要在@PostLoad. 见http://www.doctrine-project.org/jira/browse/DDC-1010

与其使用侦听器来填充对象的缺失依赖项,不如考虑在从实体管理器获取对象后使用服务层来处理它。无论如何,这将禁止您为示例中的实体提供任何代理。

于 2013-02-26T13:46:14.683 回答