<?php
namespace App\EventSubscriber;
use App\Entity\Tenant;
use App\Entity\TenantConfig;
use App\Entity\User;
use App\Service\TenantService;
use Doctrine\ORM\EntityManagerInterface;
use EasyCorp\Bundle\EasyAdminBundle\Event\AfterEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityPersistedEvent;
use EasyCorp\Bundle\EasyAdminBundle\Event\BeforeEntityUpdatedEvent;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class EasyAdminSubscriber implements EventSubscriberInterface {
/**
* @var EntityManagerInterface
*/
private EntityManagerInterface $entityManager;
/**
* @var Filesystem
*/
private Filesystem $filesystem;
/**
* @var ContainerBagInterface
*/
private ContainerBagInterface $params;
/**
* @var UserPasswordHasherInterface
*/
private UserPasswordHasherInterface $passwordHasher;
/**
* @var TenantService
*/
private TenantService $tenantService;
/**
* @param ContainerBagInterface $params
* @param EntityManagerInterface $entityManager
* @param Filesystem $filesystem
* @param TenantService $tenantService
* @param UserPasswordHasherInterface $passwordHasher
*
* @SuppressWarnings(PHPMD.LongVariable)
*/
public function __construct(
ContainerBagInterface $params,
EntityManagerInterface $entityManager,
Filesystem $filesystem,
TenantService $tenantService,
UserPasswordHasherInterface $passwordHasher
) {
$this->params = $params;
$this->entityManager = $entityManager;
$this->filesystem = $filesystem;
$this->tenantService = $tenantService;
$this->passwordHasher = $passwordHasher;
}
public static function getSubscribedEvents() {
return [
AfterEntityPersistedEvent::class => ['afterEntityPersistedCallback'],
BeforeEntityPersistedEvent::class => ['createEntityCallback'],
BeforeEntityUpdatedEvent::class => ['updateEntityCallback'],
];
}
/**
* BeforeEntityPersistedEvent callback function.
*
* @param BeforeEntityPersistedEvent $event
*
* @return void
*/
public function createEntityCallback(BeforeEntityPersistedEvent $event): void {
$entity = $event->getEntityInstance();
if (!($entity instanceof User)) {
return;
}
if (empty($entity->getPlainTextPassword())) {
return;
}
$entity->setPassword(
$this->passwordHasher->hashPassword(
$entity,
$entity->getPlainTextPassword()
)
);
}
/**
* AfterEntityPersistedEvent callback function.
*
* @param AfterEntityPersistedEvent $event
*
* @return void
*/
public function afterEntityPersistedCallback(AfterEntityPersistedEvent $event): void {
$entity = $event->getEntityInstance();
$projectDir = $this->params->get('kernel.project_dir');
if ($entity instanceof Tenant) {
$directoryToCreate = \sprintf('%1$s/public/images/%2$s', $projectDir, $entity->getUploadDirectory());
if (!$this->filesystem->exists($directoryToCreate)) {
try {
$this->filesystem->mkdir($directoryToCreate);
} catch (IOExceptionInterface $exception) {
echo 'An error occurred while creating your directory at ' . $exception->getPath();
}
}
if (!$entity->hasTenangConfig()) {
$entity->setTenantConfig(
new TenantConfig()
);
}
$this->entityManager->flush();
$this->tenantService->addDefaultTextTemplates($entity);
}
}
/**
* BeforeEntityUpdatedEvent callback function.
*
* @param BeforeEntityUpdatedEvent $event
*
* @return void
*/
public function updateEntityCallback(BeforeEntityUpdatedEvent $event): void {
$entity = $event->getEntityInstance();
if (!($entity instanceof User)) {
return;
}
if (empty($entity->getPlainTextPassword())) {
return;
}
$entity->setPassword(
$this->passwordHasher->hashPassword(
$entity,
$entity->getPlainTextPassword()
)
);
}
}