我有一个实现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。
此外,任何人都可以首先简要解释为什么这是一个问题?从我可以看到,一旦使用保湿器就会删除查询,但我不明白为什么在构建新查询时这会成为一个问题,即使重复使用保湿器也是如此。
感谢您的任何指示!
答案 0 :(得分:7)
这是不受支持的,特别是如果您在服务层内调用EntityManager
操作。
你会遇到每一种可能的怪异竞争条件,因为你基本上重新使用相同的保水剂并破坏它们的内部状态,使它们在为你的结果集保湿时无用。
这是一个已知问题,如果你真的需要在@PostLoad
期间处理这个初始化逻辑,那么它就有了解决方法。见http://www.doctrine-project.org/jira/browse/DDC-1010
不要使用侦听器来填充对象的缺失依赖项,而是在从实体管理器获取对象后,考虑使用服务层来处理它。无论如何,这将禁止您在示例中拥有该实体的任何代理。