在插入之前,我如何验证用户名和邮件是否已经存在于我的数据库中。
我尝试了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