2

Symfony (3.4) 不验证实体,不检查用户名或电子邮件是否已被占用。我的实体扩展了 FOS 用户基础实体,所以我没有覆盖任何东西。

这是我的 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";
    }
}

我的控制器:

$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());

我收到mysql错误:

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

1 回答 1

3

这可以通过UniqueConstraint向您的用户类添加 a 来防止,如下所示:

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
{
    //...
}

事实证明,我在使用相同版本构建的应用程序上也遇到了这种情况,所以感谢您发现它,从来没有测试过它:-)

于 2018-06-28T07:44:51.003 回答