在另一个实体订阅服务器中创建实体时未调用实体订阅服务器



我有以下szenario:

  • 用户创建Scan
  • ScanSubscriberprePersistpreUpdateonFlush
  • onFlush中,可能会发生一些需要与给定Scan相关的CampaignParticipation来完成的情况。我在这里更新了一些其他实体,还为相关用户创建了一个AccountBalanceChange。之后我就打电话给$unitOfWork->computeChangeSets();.

到目前为止,这效果很好。现在的问题是:

  • 我还有另一个听postPersistAccountBalanceChangeSubscriber.所以我希望当我保留我在ScanSubscriber中创建的AccountBalanceChange时调用这个订阅者,但这不会发生。

我还尝试了以下方法:

$cmf   = $entityManager->getMetadataFactory();
$meta  = $cmf->getMetadataFor(get_class($accountBalanceChange));
$unitOfWork->computeChangeSet($meta, $accountBalanceChange);

所以我的问题是:

  • 我的期望是正确的,应该调用这个侦听器,还是"堆叠侦听器"有一点限制?
  • 还是我错过了一些"注册",以使框架知道新实体,而不管新实体在我的数据库中持久保存正确?

当我使用奏鸣曲管理器保存AccountBalanceChange时,AccountBalanceChangeSubscriber本身就像一个魅力。

我的代码(非常缩短):

ScanSubscriber.php

class ScanSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
'onFlush',
);
}
public function onFlush(OnFlushEventArgs $args)
{
$entityManager = $args->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
foreach ($unitOfWork->getScheduledEntityUpdates() as $entity) {
if ($entity instanceof Scan) {
$accountBalanceChange = new AccountBalanceChange();
$entityManager->persist($accountBalanceChange);
}
}
$unitOfWork->computeChangeSets();
}
}

AccountBalanceChangeSubscriber.php

class AccountBalanceChangeSubscriber implements EventSubscriber
{
public function getSubscribedEvents()
{
return array(
'postPersist',
);
}
public function postPersist(LifecycleEventArgs $args)
{
// This is never called in the case I described but works when I save the entity using sonata admin
}
}

最后,我决定重构我的代码,将逻辑从"第二个"侦听器移动到一个单独的命令中。就在我完成这篇文章时,我想出了一个非常复杂的"功能"链,让我认为订阅者没有被调用。实际上,它被调用并且一切都按我在问题中的预期工作,但是还有另一种UserSubscriber不允许对标记为anonymousUser进行几乎所有属性更改(就我而言,直到他们"声明"他们的帐户)。而且我忘了将我想在AccountBalanceChange中更改的两个属性列入白名单.

所以,感谢您的评论,这些评论以正确的方式指导我,并有一个愉快的周末! :-)

相关内容

  • 没有找到相关文章