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

时间:2016-02-18 10:04:14

标签: symfony doctrine-orm stofdoctrineextensions

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

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

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

我每次尝试使用 slug 属性(例如 slug.jpg )重命名链接到 ImageRestaurant 实体的文件餐厅实体已更新, slug 属性将重新生成。我还想更改 ImageRestaurant 实体的 name 属性。

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

  1. onFlush事件:
  2. 我可以访问计划更新的实体(餐厅),但此时无法访问更新的slug。所以我无法更新文件和 ImageRestaurant 实体。

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

        

      在EntityManager#flush()中调用三个post事件。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非可持久化项目,例如非映射字段,日志记录甚至是未由Doctrine直接映射的关联类。

      对于这个事件,因为我可以访问实体ID,我认为我可以从数据库中获取两个实体 Restaurant (frehsly更新的)和 ImageRestaurant ,然后继续文件和 ImageRestaurant 更新?

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

1 个答案:

答案 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 }