php - 在 Doctrine postFlush 事件中获取刷新的实体

标签 php symfony doctrine-orm doctrine

考虑 Symfony 应用程序中的后续步骤:

  1. 为 Doctrine 的 postFlush 事件注册监听器,该事件转储工作单元的 getScheduledEntityInsertions() 结果。
  2. 创建 SomeEntity 类的实例。
  3. 使用先前创建的实体实例调用实体管理器的persistflush 方法
  4. postFlush 监听器已触发
  5. getScheduledEntityInsertions() 调用不返回任何内容

预期的行为是在最后一步我看到插入实体的列表,但是如果您查看 UoF 的 executeInserts() 方法,unset($this->entityInsertions[$oid ]) 调用每个实体,因此 getScheduledEntityInsertions() 调用不会返回任何内容。

我找到了那个案例的拒绝补丁:https://github.com/doctrine/doctrine2/pull/5674 Ocramius 建议使用“onFlush”事件来收集所有需要的数据并触发自定义事件:https://groups.google.com/forum/#!topic/doctrine-user/GLJEx0p5kL4

但是,我不明白如何做到:如果我为 myCustomEvent 注册自定义监听器并从 onFlush 中使用未插入的实体列表触发它 - 它会在实体实际保存到数据库(postFlush 触发)之前执行,并且无法在此监听器中从数据库接收。

最佳答案

一种可能的解决方案是为 onFlushpostFlush 事件使用一个 Listener 类,并在 onFlush 中用必要的数据填充内部属性,在 postFlush 中从属性中读取数据。但是这个解决方案有局限性:两个监听器方法必须定义在同一个类中;监听器不是线程安全的。

关于php - 在 Doctrine postFlush 事件中获取刷新的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434980/

相关文章:

php - 更新 PHPunit Xampp

php - 如何在单个页面上模拟超过 1 个请求(即 4000 或更多)来测试性能?

php - 如何定义一个实体,它通常被多个 bundle 使用?

php - Doctrine Entity增加值(下载计数器)

php - 如何从外部模型/ Controller 获取 EntityManager()?

PHP mkdir : Permission denied problem

symfony - symfony 验证最佳实践

Symfony - 设置 Flash 并检查 TWIG

php - 引用的列名必须是目标实体类上的主键列

php - 但这些与您的要求或最低稳定性相冲突