簡體   English   中英

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 utilisateurPortail(用戶名、username_canonical、電子郵件、email_canonical、啟用、salt、密碼、last_login、鎖定、過期、expires_at、confirmation_token、password_requested_at、roles、credentials_expired、credentials_expire_at、id、raisonsociale、函數,envoiSMS,電話,premiere_connexion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' 與參數 ["dd", "dd", "a@p.fr", "a@p.fr", 1, "fhaqicni2sgko4o8s4804oo8g48wcgw", "tdsZpiC1Tzbh5mAVf23uy35acc3dq5acc5acc3dq5acc5acc3dq5acc5acc3dq5acc5acc3dq5acc5acc3dq5acc5acc3dq5acc5ac3dq5acc5ac3dq5acc5acc5acc5ac3dq5acc3 ", 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:la valeur d'une clé dupliquée rompt la contrainte unique « uniq_1e48ea092fc23a8 » 詳細信息: La clé « (username_canonical)=(dd) » 存在déjà。

"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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM