Symfony2 / Doctrine 2:Sluggable 扩展:在 onFlush 或 postUpdate 事件期间访问 slug 值

Symfony2 / Doctrine 2 : Sluggable extension : Access slug value during onFlush or postUpdate Event

我有一个 Restaurant 实体与 ImageRestaurant 实体具有一对一关系。

我可以使用一个表单编辑两个实体(ImageRestauranType 嵌入在 RestaurantType 中)。

餐厅 实体有一个 slug,这是由于 StofDoctrineExtensionsBundle 生成的,并使用 Gedmo\Sluggable 注释。

我正在尝试使用 slug 属性(slug.jpg 例如)每次更新 Restaurant 实体并重新生成 slug 属性。我还想更改 ImageRestaurant 实体的 name 属性。

我有两个使用 Doctrine 事件的选项:

  1. onFlush 事件:

我可以访问计划更新的实体(餐厅),但目前无法访问更新的 slug。所以我无法更新文件和 ImageRestaurant 实体。

  1. 更新后事件:

我可以访问更新的 slug 但如 documentation 中所述,此事件与数据库中的持久性无关:

The three post events are called inside EntityManager#flush(). Changes in here are not relevant to the persistence in the database, but you can use these events to alter non-persistable items, like non-mapped fields, logging or even associated classes that are not directly mapped by Doctrine.

对于此事件,因为我可以访问实体 ID,所以我认为我可以获取实体 Restaurant(最新更新的实体)和 ImageRestaurant 从数据库并继续到文件和 ImageRestaurant 更新 ?

关于如何实现此目标的任何想法?

解决方法很简单。 slug 是为学说事件 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 }