preUpdate中的EntityChangeSet不包含关系?

时间:2014-05-02 00:33:09

标签: symfony doctrine-orm

我正在尝试在用户加入群组时执行某些操作。我正在尝试使用preUpdate事件,然后检查相应的关系是否已更改。不幸的是,在我的小组中,'用户"从不在变更集中,以及在我的用户中,用户组永远不会在变更集中。

这两位听众:

public function preUpdate(PreUpdateEventArgs $args){
    if($args->hasChangedField('users')){
        $old = $args->getOldValue('users');
        $new = $args->getNewValue('users');
    }
}

public function preUpdate(PreUpdateEventArgs $args){
    if($args->hasChangedField('userGroups')){
        $old = $args->getOldValue('userGroups');
        $new = $args->getNewValue('userGroups');
    }
}

这就是我的TestCase:

$group->addUser($user);

$em->beginTransaction();
$em->persist($group);
$em->flush();
$em->rollback();

两个侦听器都被调用,但关系永远不会在变更集中。

我想将用户添加到redis表中,我在其中管理一些特定数据。也许onFlush或其他一些事件更好,因为我不需要修改保存的数据。我只是想知道我的用户 - 用户组关系中是否有新的条目。我认为最简单的方法是检查这个是preUpdate函数中的变更集。

1 个答案:

答案 0 :(得分:2)

我通过onFlush事件解决了它:

public function onFlush(OnFlushEventArgs $args){
    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();

    foreach ($uow->getScheduledCollectionUpdates() as $col) {
        if($this->isUserGroupUserAssociation($col->getMapping())){
            $userGroup = $col->getOwner();
            foreach($col->getInsertDiff() as $user){
                $this->container->get('strego_user.user_manager')->triggerJoined($userGroup,$user);
            }
        }
    }
}
protected function isUserGroupUserAssociation($association){
    return($association['fieldName'] == "users" &&
           $association['sourceEntity'] == "Strego\UserBundle\Entity\UserGroup"
    );
}