在postLoad中加载Doctrine实体

时间:2013-02-26 09:41:30

标签: doctrine-orm

我有一个实现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期间无法保存实体。

我偶然发现了this ticket,建议在新密钥下注册ObjectHydrator并在任何新查询期间指定保护器。

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

此外,任何人都可以首先简要解释为什么这是一个问题?从我可以看到,一旦使用保湿器就会删除查询,但我不明白为什么在构建新查询时这会成为一个问题,即使重复使用保湿器也是如此。

感谢您的任何指示!

1 个答案:

答案 0 :(得分:7)

这是不受支持的,特别是如果您在服务层内调用EntityManager操作。

你会遇到每一种可能的怪异竞争条件,因为你基本上重新使用相同的保水剂并破坏它们的内部状态,使它们在为你的结果集保湿时无用。

这是一个已知问题,如果你真的需要在@PostLoad期间处理这个初始化逻辑,那么它就有了解决方法。见http://www.doctrine-project.org/jira/browse/DDC-1010

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