2016-03-25 2 views
2

Как проверить, что имя пользователя и почта еще не присутствуют в моей базе данных до вставки.Symfony2: FOSUserBundle - SQLSTATE [23505]: Уникальное нарушение: при регистрации пользователя

Я пробовал метод isValid(), но он не работает.

Мои Entity:

<?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é !'; 
    } 
} 

Я получаю эту ошибку/исключение при попытке сохранения пользователя с именем, которое уже существует в базе данных:

A Исключение произошло при выполнении 'INSERT INTO utilisateurPortail (us ername, username_canonical, электронная почта, email_canonical, включена, соль, пароль, last_login, блокировка, истечение expires_at, confirmation_token, password_requested_at, роли, credentials_expired, credentials_expire_at, идентификатор, raisonsociale, псевдоним, Prénom, fonction, envoiSMS, телефон, premiere_connexion) VALUES (?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?)»с Params [ "дд", "дд", "[email protected]", "[email protected]", 1, "fhaqicni2sgko4o8s4804oo8g48wcgw", "tdsZpiC1Tzbh5mAVf23uyp9hnXDv39eEXzBh4/P3/DECu5z3QbqGHJjSSy6ccpir6T35rS5r043WSacBqazJNA ==", null, 0, 0, null, null, null, "a: 1: {i: 0; s: 16: \" ROLE_SUPER_ADMIN \ ";}", 0, null, 8, "sdfsdq", "aaa" «aaa», «dsfvsdf», 1, «3333333333», 1]:

SQLSTATE [23505]: Уникально нарушение: 7 ERREUR: л Valeur сГип clé dupliquée rompt ли contrainte уникальной «uniq_1e48ea092fc23a8» ДЕТАЛЬ: La clé «(username_canonical) = (дд)» Existe дежа.

ответ

0

Используйте ограничение 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 
1

"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()); 
} 
Смежные вопросы