Search code examples
symfonyfosuserbundlesymfony-validator

Symfony does not validate entity


Symfony (3.4) doesn't validate entity, doesn't check if username or email are already taken. My entity extending FOS User base entity, so I didn't override anything.

Here is my CreateUserType.php

class CreateUserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class)
            ->add('username', TextType::class)
            ->add('plainPassword', RepeatedType::class, [
                'type' => PasswordType::class
            ])
            ->add('enabled', CheckboxType::class)
        ;

        parent::buildForm($builder, $options);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'csrf_protection' => false
        ]);
    }

    public function getBlockPrefix()
    {
        return "user";
    }
}

And my controller:

$user = new User();

$form = $this->createForm(CreateUserType::class, $user, ['method' => 'POST']);
$form->handleRequest($request);

if($form->isSubmitted() && $form->isValid()) {
    $em->persist($user);
    $em->flush();

    $view = $this->createView(null, [], 201);
    return $this->handleView($view);
}

throw new BadRequestException($form->getErrors());

I'm getting mysql error:

Integrity constraint violation: 1062 Duplicate entry 'any_username' for key 'UNIQ_8D93D64992FC23A8'

Solution

  • This can be prevented by adding a UniqueConstraint to your user class like so:

    use FOS\UserBundle\Model\User as BaseUser;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * @UniqueEntity(fields={"email"}, message="This email address is already in use")
     * @UniqueEntity(fields={"username"}, message="This username is already in use")
     */
    class User extends BaseUser
    {
        //...
    }
    

    Turns out I was getting that too on an application I am building with the same versions so thanks for spotting that, never though to test for it :-)