Bonjour,
J'utilise une mapped superclass appelée BaseEntity pour la quasi totalité des entités des différents bundles de mon projet afin d'avoir systématiquement des champs comme "is_active", "created_at", "created_by", ...
Pour mes premiers essais de mise à jour automatique de ces champs, j'ai essayé un lifecycle-callback dans la description de l'entité qui appelle un prePersist. Tout cela était nickel par exemple pour mettre à jour le created_at et ça fonctionne parfaitement. Par contre, pour le created_by, il faut que je passe le $user actuel à la fonction prePersist mais cela n'est pas prévu dans le lifecycle callback. Qu'à cela ne tienne, je sais que je peux faire un listener. C'est un peu plus long mais ça correspond il me semble à ce que je veux faire.
J'ai mis ma superentité dans le AppBundle car j'ai bien l'intention d'utiliser ce bundle "par défaut" pour les choses communes à mes autres bundles (la super entité, le layout, ...). Mais je m'aperçois que ce bundle ne fonctionne pas vraiment comme les autres. Par exemple, si je pose un fichier Resources/config/services.xml, il est complètement ignoré. J'ai rajouté un dossier dependyInjection avec un fichier configuration.php et un AppExtension.php mais ces fichiers sont aussi complètement ignorés même si ils comportent des parse error énormes. Déjà, si vous avec des indications pour corriger ce problème, ça m'intéresse.
Qu'à cela ne tienne également, en attendant, je décide de déclarer mon listener dans le fichier app/config/services.yml comme suit :
Mon listener se trouve bien dans le dossier spécifié et pourtant, même avec un parse error énorme, il n'est pas non plus appelé même en cas de mise à jour d'une entité "fille" de la mapped superclass BaseEntity. Curieusement, si je fais le même Listener (à peu de choses près, en l'adaptant au contexte bien sûr) dans un de mes bundles, il est bien appelé grâce au fichier services.xml qui va bien et si j'ai le malheur d'y mettre volontairement un parse error, Symfony me le fait remarquer immédiatement ce qui me laisse croire que ce AppBundle est décidément un bundle pas comme les autres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 parameters: AppBundle.entity.BaseEntity.class: AppBundle\Listener\BaseEntityListener services: App.BaseEntity.listener: class: %AppBundle.entity.BaseEntity.class% arguments: { name: doctrine.event_listener, event: prePersist }
Je m'aperçois également que, si dans mon fichier app/config/services.yml je change le nom de la classe par un nom qui n'existe pas, symfony ne bronche même pas alors que j'ai déjà galéré pour simplement des problèmes d'espace ce que je trouve étonnant.
Bref, au final, comment gérer ce genre de mise à jour automatique sachant que (et ça c'est facile à faire) je ne souhaite pas être obligé pour chacune de mes entités, de faire la mise à jour d'un tel champ explicitement.
Partager