53 lines
1.7 KiB
PHP
53 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use App\Dto\RegisterRequest;
|
|
use App\Entity\User;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\JsonResponse;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
|
|
use Symfony\Component\Routing\Attribute\Route;
|
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
|
|
|
final class RegisterController extends AbstractController
|
|
{
|
|
public function __construct(
|
|
private UserPasswordHasherInterface $passwordHasher,
|
|
private EntityManagerInterface $entityManager,
|
|
private ValidatorInterface $validator,
|
|
) {
|
|
}
|
|
|
|
#[Route('/api/register', name: 'api_register', methods: ['POST'])]
|
|
public function register(Request $request): JsonResponse
|
|
{
|
|
$content = $request->toArray();
|
|
|
|
$requestDto = new RegisterRequest($content['email'] ?? '', $content['password'] ?? '');
|
|
$violations = $this->validator->validate($requestDto);
|
|
|
|
if (\count($violations) > 0) {
|
|
$errors = [];
|
|
foreach ($violations as $violation) {
|
|
$errors[$violation->getPropertyPath()][] = $violation->getMessage();
|
|
}
|
|
|
|
return $this->json(['errors' => $errors], 422);
|
|
}
|
|
|
|
$user = new User();
|
|
$user->setEmail($requestDto->email);
|
|
$user->setPassword($this->passwordHasher->hashPassword($user, $requestDto->password));
|
|
|
|
$this->entityManager->persist($user);
|
|
$this->entityManager->flush();
|
|
|
|
return $this->json([
|
|
'id' => (string) $user->getId(),
|
|
'email' => $user->getEmail(),
|
|
], 201);
|
|
}
|
|
}
|