Closed
Description
For user registration, I have an EventSubscriber
to encode password, generate confirmation token and finally to send email confirmation to the user.
This works fine in REST
but not at all in graphql
.
Searching in this repository I found a couple of issues related to this, including this one, but it is not clear to me the current status.
It seems to have been merged but the issue is present on my installation with
"api-platform/api-pack": "^1.2",
.
This is the code in case of need:
<?php
namespace App\EventSubscriber;
use App\Entity\User;
use App\Email\Mailer;
use App\Security\TokenGenerator;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use ApiPlatform\Core\EventListener\EventPriorities;
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\HttpFoundation\Request;
class UserRegisterSubscriber implements EventSubscriberInterface
{
/**
* @var UserPasswordEncoderInterface
*/
private $passwordEncoder;
/**
* @var TokenGenerator
*/
private $tokenGenerator;
/**
* @var Mailer
*/
private $mailer;
public function __construct(
UserPasswordEncoderInterface $passwordEncoder,
TokenGenerator $tokenGenerator,
Mailer $mailer
)
{
$this->passwordEncoder = $passwordEncoder;
$this->tokenGenerator = $tokenGenerator;
$this->mailer = $mailer;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::VIEW => ['userRegistered', EventPriorities::PRE_WRITE],
];
}
public function userRegistered(GetResponseForControllerResultEvent $event)
{
$user = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!$user instanceof User ||
!in_array($method, [Request::METHOD_POST])) {
return;
}
$user->setPassword(
$this->passwordEncoder->encodePassword($user, $user->getPassword())
);
// Create confirmation token
$user->setConfirmationToken(
$this->tokenGenerator->getRandomSecureToken()
);
// Send e-mail here...
$this->mailer->sendConfirmationEmail($user);
}
}