0

我有一个与ImageRestaurant实体具有一对一关系的餐厅实体。

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

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

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

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

  1. onFlush 事件:

我可以访问计划更新的实体(Restaurant),但此时无法访问更新的 slug。所以我无法更新文件和ImageRestaurant实体。

  1. 更新后事件:

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

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

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

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

4

1 回答 1

0

解决方案非常简单。slug是为onFlush学说事件生成的。我的侦听器(在我的例子中是订阅者)需要在Sluggable 侦听器之后执行才能访问重新生成的 slug 属性。

这是我注册订阅者的方式(注意 Symfony 监听器和教义监听器之间的区别- 看看 Stof 评论):

fbn_guide.doctrine_listener:
    class : FBN\GuideBundle\EventListener\DoctrineListener
    arguments: [@fbn_guide.image_manager]
    tags:
        - { name: doctrine.event_subscriber, connection: default, priority: -10000 }
于 2016-02-23T15:02:00.283 回答