【问题标题】:Symfony2 / Doctrine 2 : Sluggable extension : Access slug value during onFlush or postUpdate EventSymfony2 / Doctrine 2:Sluggable 扩展:在 onFlush 或 postUpdate 事件期间访问 slug 值
【发布时间】:2016-02-18 10:04:13
【问题描述】:

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

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

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

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

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

  1. onFlush 事件:

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

  1. 更新后事件:

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

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

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

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

【问题讨论】:

    标签: symfony doctrine-orm stofdoctrineextensions


    【解决方案1】:

    解决方案非常简单。 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 }
    

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 2017-11-13
      • 2014-06-29
      • 2016-11-23
      • 2013-10-11
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多