siwymilek
siwymilek

Reputation: 815

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'

Upvotes: 2

Views: 101

Answers (1)

Bananaapple
Bananaapple

Reputation: 3114

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 :-)

Upvotes: 3

Related Questions