gpt4 book ai didi

php - 在 postLoad 中加载 Doctrine 实体

转载 作者:行者123 更新时间:2023-12-02 07:37:09 25 4
gpt4 key购买 nike

我有一个实现 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这建议在新 key 下注册 ObjectHydrator 并在任何新查询期间指定水化器。

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

此外,谁能简要解释一下为什么这是一个问题?据我所知,一旦使用了水化器,查询就会被删除,但我不明白为什么在构建新查询时这会成为问题,即使水化器被重复使用也是如此。

谢谢指点!

最佳答案

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

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

这是一个已知问题,如果您确实需要在 @PostLoad 期间处理此初始化逻辑,则有解决方法。参见 http://www.doctrine-project.org/jira/browse/DDC-1010

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

关于php - 在 postLoad 中加载 Doctrine 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com