Symfony 2 - 在postUpdate fire preUpdate事件中刷新

guy*_*oni 10 event-listener symfony doctrine-orm

我发现这个问题"谢谢"了我得到的一个例外:

Catchable Fatal Error: Argument 3 passed to
Doctrine\ORM\Event\PreUpdateEventArgs::__construct() 
must be an array, null given, called in 
/.../vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php on line 804 
and defined in
/.../vendor/doctrine/lib/Doctrine/ORM/Event/PreUpdateEventArgs.php line 28
Run Code Online (Sandbox Code Playgroud)

我正在开发一个需要特定逻辑的项目:
order实体中的字段book被修改时,我需要更新books_order_modified_at父实体中的bookstore字段(该字段允许我知道书店中书籍的顺序是否被更改).

我决定在事件监听器中执行此操作,因为代码中有许多位置可能会改变书籍的顺序.

我没有找到任何方法来更新preUpdate事件中的相关实体,所以我在监听器类中有一个私有字段,用于告诉postUpdate事件更新相关bookstore实体.

我的问题是,当我这样做preUpdate时,book实体的事件被触发.
当我检查更改集时,它只包含modified_at字段,但前后具有相同的值.

如果有人有另一个想法如何解决问题 - 太好了.

如果不是 - 任何想法如何preUpdate在teh postUpdate事件中调用flush时阻止事件被触发?

Cal*_*lea 6

实际上,这是学说Doctrine Issue DDC-2726的问题.通过在侦听器中刷新后在实体管理器上添加一个清除调用来解决它,因此将重写该构造函数的3-rd参数,实际上是entityChangeSets.

  • 嗨,卡林!您能否向我们提供一些示例代码,以便我们可以看到您在哪里执行clear()调用?Multumesc期待! (7认同)
  • "$ args-> getEntityManager() - >清除();" 只需调用实体管理器的clear方法即可. (2认同)

Sgo*_*kes 1

modified_at更新你的实体内部并让教条来处理怎么样?您可以更改书中的 setOrder 方法来更新 BookOrder 实体,如下所示:

class Book {
    public function setOrder($order) {
        // modify book
        $this->bookOrder->updateModifiedAt();
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您的 BookOrder 必须实现 moddedAt:

class BookOrder {
    public function updateModifiedAt() {
        $this->modifiedAt = new \DateTime();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用其他类作为日期时间,您当然必须更改此代码!

Doctrine 应该认识到 BookOrder 已更改,并且应该更新它,而无需使用事件侦听器。