<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Manager\UserManager;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class UserSubscriber implements EventSubscriberInterface
{
/**
* @var UserManager
*/
private $userManager;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var UserPasswordEncoderInterface
*/
private $passwordEncoder;
public function __construct(UserManager $userManager, EntityManagerInterface $entityManager, UserPasswordEncoderInterface $passwordEncoder)
{
$this->userManager = $userManager;
$this->entityManager = $entityManager;
$this->passwordEncoder = $passwordEncoder;
}
public static function getSubscribedEvents()
{
return [
AfterEntityPersistedEvent::class => ['sendEmail'],
BeforeEntityUpdatedEvent::class => ['updatePasswordIfExisting'],
];
}
public function updatePasswordIfExisting(BeforeEntityUpdatedEvent $event)
{
$entity = $event->getEntityInstance();
if (!($entity instanceof User)) {
return;
}
$uow = $this->entityManager->getUnitOfWork();
$uow->computeChangeSets();
$changeset = $uow->getEntityChangeSet($entity);
if (array_key_exists('password', $changeset) && $changeset['password'][0] !== $changeset['password'][1]) {
$entity->setPassword($this->passwordEncoder->encodePassword($entity, $changeset['password'][1]));
}
}
public function sendEmail(AfterEntityPersistedEvent $event)
{
$entity = $event->getEntityInstance();
if (!($entity instanceof User)) {
return;
}
$this->userManager->sendConfirmationRegisterMail($entity);
}
}