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时阻止事件被触发?
实际上,这是学说Doctrine Issue DDC-2726的问题.通过在侦听器中刷新后在实体管理器上添加一个清除调用来解决它,因此将重写该构造函数的3-rd参数,实际上是entityChangeSets.
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 已更改,并且应该更新它,而无需使用事件侦听器。
| 归档时间: |
|
| 查看次数: |
6311 次 |
| 最近记录: |