logger = $logger; } public function onFlush(OnFlushEventArgs $event) { $uow = $event->getEntityManager()->getUnitOfWork(); $updates = $uow->getScheduledEntityUpdates(); foreach ($updates as $update) { $this->processEntity($update, $event->getEntityManager(), $uow); } } private function processEntity($entity, EntityManager $em, UnitOfWork $uow) { if (!($entity instanceof EmailAddress)) return; $changeSet = $uow->getEntityChangeSet($entity); /* @var $entity EmailAddress */ // verification status of the email address has changed and it is not the primary email address if (isset($changeSet['verified']) && $entity->isVerified()) { $expiredUser = $em->find(ExpiredUser::class, $entity->getUser()); $this->logger->debug('User expiration record for user.', [ 'user' => $entity->getUser(), 'expired_user' => $expiredUser, 'is_expired' => $expiredUser ? $expiredUser->isExpired() : null ]); if (!$expiredUser || !$expiredUser->isExpired()) return; /* @var $expiredUser ExpiredUser */ $this->logger->info('An email address has been verified, clearing expiration for user.', [ 'user' => $entity->getUser(), 'expired_user' => $expiredUser ]); $expiredUserMeta = $em->getMetadataFactory()->getMetadataFor(ExpiredUser::class); $expiredUser->setExpiredAt(null); $uow->recomputeSingleEntityChangeSet($expiredUserMeta, $expiredUser); if (!$entity->isPrimary()) { $primaryAddress = $entity->getUser()->getPrimaryEmailAddress(); if ($primaryAddress->isVerified()) return; $this->logger->info('An email address has been verified, but the primary email address has not been verified. Switching primary email address to the verified email address.', [ 'user' => $entity->getUser(), 'old_primary_address' => $primaryAddress, 'verified_address' => $entity ]); $emailAddressMeta = $em->getMetadataFactory()->getMetadataFor(EmailAddress::class); $primaryAddress->setPrimary(false); $uow->recomputeSingleEntityChangeSet($emailAddressMeta, $primaryAddress); $entity->setPrimary(true); $uow->recomputeSingleEntityChangeSet($emailAddressMeta, $entity); } } } }