我有以下szenario:
Scan
ScanSubscriber
收听prePersist
,preUpdate
和onFlush
onFlush
中,可能会发生一些极少数情况需要与CampaignParticipation
相关的Scan
才能完成。我在这里更新了一些其他实体,我还为相关用户创建了AccountBalanceChange
。之后,我只需致电$unitOfWork->computeChangeSets();
。直到这一点,这很有效。现在问题是:
AccountBalanceChangeSubscriber
听取postPersist
。因此,我希望在我保留AccountBalanceChange
ScanSubscriber
时保留此订阅者,但这不会发生。我也尝试过这样的事情:
$cmf = $entityManager->getMetadataFactory();
$meta = $cmf->getMetadataFor(get_class($accountBalanceChange));
$unitOfWork->computeChangeSet($meta, $accountBalanceChange);
所以我的问题是:
当我使用奏鸣曲管理员保存AccountBalanceChangeSubscriber
时,AccountBalanceChange
本身就像一个魅力。
我的代码(非常简短):
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
}
}
答案 0 :(得分:0)
最后,我决定重构我的代码,将逻辑从“第二个”监听器转移到一个单独的命令中。就在我完成这个时,我发现了一个非常复杂的“功能”链,这使我认为没有调用用户。实际上它被调用,一切都按照我的预期在我的问题中工作,但还有另一个UserSubscriber
,它不允许User
的几乎所有属性更改s被标记为anonymous
(在我的情况下,直到他们“声称”他们的帐户)。我忘了在AccountBalanceChange
中将我想要更改的两个属性列入白名单。
所以,感谢以正确的方式指导我并且周末愉快的评论! : - )