在另一个实体订户内创建实体时未调用实体订户

时间:2017-05-26 13:13:09

标签: php symfony doctrine-orm symfony-3.2

我有以下szenario:

  • 用户创建Scan
  • ScanSubscriber收听prePersistpreUpdateonFlush
  • 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
    }
}

1 个答案:

答案 0 :(得分:0)

最后,我决定重构我的代码,将逻辑从“第二个”监听器转移到一个单独的命令中。就在我完成这个时,我发现了一个非常复杂的“功能”链,这使我认为没有调用用户。实际上它被调用,一切都按照我的预期在我的问题中工作还有另一个UserSubscriber,它不允许User的几乎所有属性更改s被标记为anonymous(在我的情况下,直到他们“声称”他们的帐户)。我忘了在AccountBalanceChange中将我想要更改的两个属性列入白名单。

所以,感谢以正确的方式指导我并且周末愉快的评论! : - )