我有以下szenario:
- 用户创建
Scan
ScanSubscriber
听prePersist
、preUpdate
和onFlush
- 在
onFlush
中,可能会发生一些需要与给定Scan
相关的CampaignParticipation
来完成的情况。我在这里更新了一些其他实体,还为相关用户创建了一个AccountBalanceChange
。之后我就打电话给$unitOfWork->computeChangeSets();
.
到目前为止,这效果很好。现在的问题是:
- 我还有另一个听
postPersist
AccountBalanceChangeSubscriber
.所以我希望当我保留我在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
不允许对标记为anonymous
的User
进行几乎所有属性更改(就我而言,直到他们"声明"他们的帐户)。而且我忘了将我想在AccountBalanceChange
中更改的两个属性列入白名单.
所以,感谢您的评论,这些评论以正确的方式指导我,并有一个愉快的周末! :-)