src/EventListener/UserEntityEventListener.php
<?php
declare(strict_types = 1);
/**
* /src/EventListener/UserEntityEventListener.php
*
* @author TLe, Tarmo Leppänen <tarmo.leppanen@pinja.com>
*/
namespace App\EventListener;
use App\Entity\User;
use App\Security\SecurityUser;
use Doctrine\Persistence\Event\LifecycleEventArgs;
use LengthException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use function strlen;
/**
* @package App\EventSubscriber
* @author TLe, Tarmo Leppänen <tarmo.leppanen@pinja.com>
*/
class UserEntityEventListener
{
public function __construct(
private readonly UserPasswordHasherInterface $userPasswordHasher,
) {
}
public function prePersist(LifecycleEventArgs $event): void
{
$this->process($event);
}
public function preUpdate(LifecycleEventArgs $event): void
{
$this->process($event);
}
private function process(LifecycleEventArgs $event): void
{
// Get user entity object
$user = $event->getObject();
// Valid user so lets change password
if ($user instanceof User) {
$this->changePassword($user);
}
}
private function changePassword(User $user): void
{
// Get plain password from user entity
$plainPassword = $user->getPlainPassword();
// Yeah, we have new plain password set, so we need to encode it
if ($plainPassword !== '') {
if (strlen($plainPassword) < 8) {
throw new LengthException('Too short password');
}
// Password hash callback
$callback = fn (string $plainPassword): string => $this->userPasswordHasher
->hashPassword(new SecurityUser($user, []), $plainPassword);
// Set new password and encode it with user encoder
$user->setPassword($callback, $plainPassword);
// And clean up plain password from entity
$user->eraseCredentials();
}
}
}