Symfony2:FOSUserBundle-SQLSTATE[23505]:唯一冲突:在用户注册期间


Symfony2: FOSUserBundle - SQLSTATE[23505]: Unique violation: during user registration

在插入之前,我如何验证用户名和邮件是否已经存在于我的数据库中。

我尝试了isValid()方法,但它不起作用。

我的实体:

 <?php
namespace Fiducial'UserBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use FOS'UserBundle'Model'User as BaseUser;
/**
 * User
 *
 * @ORM'Table(name="utilisateurPortail")
 * @ORM'Entity(repositoryClass="Fiducial'UserBundle'Repository'UtilisateurPortailRepository")
 */
class UtilisateurPortail extends BaseUser
{
    /**
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;

在我的控制器内部:

if ($form->isValid()) {
    if($userManager->findUserByUsername($user->getUsername()) != null) {
        $message = 'Nom d''utilisateur déjà utilisé';
    } elseif($userManager->findUserByEmail($user->getEmail()) != null) {
        $message = 'Email déjà utilisé';
    } else {
        $userManager->updateUser($user);
        $message = 'Utilisateur ajouté !';
    }
}

当我试图用已经存在的用户名将用户保存到数据库时,会出现此错误/异常:

一个执行"INSERT INTO Utilities"门户时发生异常(用户名,用户名_canonical,电子邮件,电子邮件_canonic,已启用,salt,密码,last_login,锁定,过期,expires_at,confirmation_token,password_requested_at,角色,凭据已过期,credentials_expire_at,id,raisonsociale,nom,prenom,foction,envoiSMS,电话,premie_connexion)值(?,带有params["dd","dd","a@p.fr","a@p.fr",1,"fhaqini2sgko4o8s4804oo8g48wcgw","tdsZpiC1Tzbh5mAVf23uyp9hnXDv39eEXzBh4/P3/DECu5z3QbqGHJjSSy6ccpir6T35rS5r043WSacBqazJNA==",null,0,0,null,null,"a:1:{i:0;s:16:''"ROLE_SUPER_ADMIN''";}",0,null,8,"sdfsdq","aaa","aaa","dsfvsdf",1,"3333333333",1]:

SQLSTATE[23505]:唯一违规:7错误:la valeur d'une clé独特的"uniq_1e48ea092fc23a8"细节:La clé«(用户名_canonical)=(dd)»存在。

"username_canonical"是由FOSBundle用户名验证的,因此您需要重写代码

if ($form->isValid()) {
    if($userManager->findUserByUsernameCanonical($user->getUsernameCanonical()) != null) {
        $message = 'Nom d''utilisateur déjà utilisé';
    } elseif($userManager->findUserByEmail($user->getEmail()) != null)      {
        $message = 'Email déjà utilisé';
    } else {
        $userManager->updateUser($user);
        $message = 'Utilisateur ajouté !';
    }
 }

和功能

public function getUsernameCanonical()
{
     // Better to assign this util by __construct or as parameter to this function
     $canonicalizer = FOS'UserBundle'Util'Canonicalizer();
     return canonicalizer->canonicalize($this->getUsername());
}

使用UniqueEntity验证约束检查数据库中是否已存在用户名电子邮件

use Doctrine'ORM'Mapping as ORM;
use Symfony'Bridge'Doctrine'Validator'Constraints'UniqueEntity;
/**
 * @ORM'Table(name="table")
 * @ORM'Entity(repositoryClass="Fiducial'UserBundle'Repository'UtilisateurPortailRepository")
 *
 * -> Add this annotation
 *
 * @UniqueEntity(
 *     fields={"username", "email"}
 * )
 */
class UtilisateurPortail extends BaseUser