Symfony2: FOSUserBundle — SQLSTATE [23505]: уникальное нарушение: при регистрации пользователя

Как я могу проверить, что имя пользователя и почта еще не присутствовали в моей базе данных до вставки.

Я пробовал с 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 utilisateurPortail
(имя пользователя, username_canonical, электронная почта, email_canonical, включено, соль,
пароль, last_login, заблокирован, срок действия истек, expires_at, response_token,
password_requested_at, роли, credentials_expired,
credentials_expire_at, id, raisonsociale, nom, prenom, fonction,
envoiSMS, телефон, premiere_connexion) ЗНАЧЕНИЯ (?,?,?,?,?,?,?,
?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ‘с параметрами [«dd»,
«dd», «[email protected]», «[email protected]», 1, «fhaqicni2sgko4o8s4804oo8g48wcgw»,
«TdsZpiC1Tzbh5mAVf23uyp9hnXDv39eEXzBh4 / P3 / DECu5z3QbqGHJjSSy6ccpir6T35rS5r043WSacBqazJNA ==»,
ноль, 0, 0, ноль, ноль, ноль, «a: 1: {i: 0; s: 16: \» ROLE_SUPER_ADMIN \ «;}»,
0, null, 8, «sdfsdq», «aaa», «aaa», «dsfvsdf», 1, «3333333333», 1]:

SQLSTATE [23505]: уникальное нарушение: 7 ERREUR: la valeur d’une clé
dupliquée Rrompt la contrainte unique «uniq_1e48ea092fc23a8» ПОДРОБНЕЕ:
La clé «(username_canonical) = (dd)» existe déjà.

2

Решение

«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());
}
1

Другие решения

Использовать 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
0

По вопросам рекламы [email protected]