<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Admin;
use App\Entity\User;
use JetBrains\PhpStorm\ArrayShape;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class PasswordSubscriber implements EventSubscriberInterface
{
public function __construct(private UserPasswordHasherInterface $encoder)
{
}
#[
ArrayShape([KernelEvents::VIEW => "array"])
]
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['passwordEncoder', EventPriorities::PRE_WRITE],
];
}
public function passwordEncoder(ViewEvent $event): void
{
$user = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!($user instanceof User || $user instanceof Admin) || Request::METHOD_POST !== $method) {
return;
}
if ($user->getPassword()=== null) {
return;
}
$passWord = $this->encoder->hashPassword($user, $user->getPassword());
$user->setPassword($passWord);
}
}