我有一个 Restaurant 实体,与 ImageRestaurant 实体有一对一的关系。
我可以使用单一表单编辑两个实体(ImageRestauranType嵌入在RestaurantType中)。
餐厅实体有一个 slug ,它由StofDoctrineExtensionsBundle生成,并使用Gedmo \ Sluggable注释。
我每次尝试使用 slug 属性(例如 slug.jpg )重命名链接到 ImageRestaurant 实体的文件餐厅实体已更新, slug 属性将重新生成。我还想更改 ImageRestaurant 实体的 name 属性。
我有两个使用Doctrine事件的选项:
我可以访问计划更新的实体(餐厅),但此时无法访问更新的slug。所以我无法更新文件和 ImageRestaurant 实体。
我可以访问更新的 slug 但是如documentation中所述,此事件与数据库中的持久性无关:
在EntityManager#flush()中调用三个post事件。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非可持久化项目,例如非映射字段,日志记录甚至是未由Doctrine直接映射的关联类。
对于这个事件,因为我可以访问实体ID,我认为我可以从数据库中获取两个实体 Restaurant (frehsly更新的)和 ImageRestaurant ,然后继续文件和 ImageRestaurant 更新?
关于如何实现这一目标的任何想法?
答案 0 :(得分:0)
解决方案非常简单。 slug 是为doctrine事件 onFlush 生成的。我的监听器(在我的情况下是订户)需要在Sluggable listener之后执行才能访问重新生成的slug属性。
以下是我注册订阅者的方式(note the difference between Symfony listeners and doctrine listeners - 查看Stof评论):
fbn_guide.doctrine_listener:
class : FBN\GuideBundle\EventListener\DoctrineListener
arguments: [@fbn_guide.image_manager]
tags:
- { name: doctrine.event_subscriber, connection: default, priority: -10000 }