在我的应用中保存实体时,我想将其slug
字段添加到查找表中。为了尽可能减少干扰,我写了一个事件订阅者。根据{{3}},INSERT
事件我无法postUpdate
,所以我尝试了postFlush
:
class SlugsSubscriber implements EventSubscriber {
public function getSubscribedEvents() {
return array('postFlush');
}
public function postFlush(PostFlushEventArgs $args) {
$em = $args->getEntityManager();
$needsFlush = false;
error_log("postFlush");
foreach ($em->getUnitOfWork()->getScheduledEntityInsertions() as $entity) {
// To prevent short-circuit
$tmp = $this->registerSlugs($entity, $entityManager);
if($tmp) $needsFlush = true;
}
foreach ($em->getUnitOfWork()->getScheduledEntityUpdates() as $entity) {
// To prevent short-circuit
$tmp = $this->registerSlugs($entity, $entityManager);
if($tmp) $needsFlush = true;
}
if($needsFlush) {
error_log("Flushing");
$em->flush();
}
}
protected function registerSlugs($entity, EntityManager $entityManager) {
error_log("register slugs");
if($entity instanceof Product) {
$this->registerProductSlugs($entity, $entityManager);
return true;
} elseif($entity instanceof Category) {
$this->registerCategorySlugs($entity, $entityManager);
return true;
}
return false;
}
}
但是,当我尝试现在保存实体时,永远不会调用方法registerSlugs
,无论是更新还是新插入。
我哪里出错了?
答案 0 :(得分:0)
您需要获取数据库对象,编辑它,保留它,然后刷新它以便将其保存回数据库。如果没有先保留一些对象就不能调用flush,这就是为什么从不调用registerSlugs的原因。现在没有什么可以保存的。
要更改设计,我认为你必须有另一个变量来引用你正在创建一个slug的实体的对象。这个对象需要在数据库中有一个名为slug的字段,你创建slug,然后保持对象,然后刷新以便保存。有关持久性冲洗对象的信息,请参阅http://symfony.com/doc/current/book/doctrine.html#a-simple-example-a-product。