当我想使用Symfony上的FOSUserBundle登录时,我一直在标题中收到错误。问题是,我已经从我的数据库中获得了我的用户表的“id”,所以我不想创建像他们在FOSUserBundle指南上询问的“id”字段。我不明白为什么当我的代码中没有“id”字段时它会给我这个错误。
这个“id”字段是强制性的吗?
这是我的User类的代码(这里称为“Utilisateurs”)`使用Doctrine \ ORM \ Mapping作为ORM; 使用FOS \ UserBundle \ Model \ User作为BaseUser;
/**
* Utilisateurs
*
* @ORM\Table(name="utilisateurs", indexes={@ORM\Index(name="FK_UTILISATEURS_id_sexe", columns={"id_sexe"}), @ORM\Index(name="FK_UTILISATEURS_id_niveau", columns={"id_niveau"})})
* @ORM\Entity
*/
class Utilisateurs extends BaseUser
{
public function __construct()
{
parent::__construct();
}
/**
* @var string
*
* @ORM\Column(name="nom", type="string", length=25, nullable=true)
*/
private $nom;
/**
* @var string
*
* @ORM\Column(name="prenom", type="string", length=25, nullable=true)
*/
private $prenom;
/**
* @var \DateTime
*
* @ORM\Column(name="date_naissance", type="date", nullable=true)
*/
private $dateNaissance;
/**
* @var string
*
* @ORM\Column(name="url_photo", type="string", length=100, nullable=true)
*/
private $urlPhoto;
/**
* @var integer
*
* @ORM\Column(name="id_utilisateur", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $idUtilisateur;
/**
* @var \Site\UserBundle\Entity\Sexes
*
* @ORM\ManyToOne(targetEntity="Site\UserBundle\Entity\Sexes")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_sexe", referencedColumnName="id_sexe")
* })
*/
private $idSexe;
/**
* @var \Site\UserBundle\Entity\Niveaux
*
* @ORM\ManyToOne(targetEntity="Site\UserBundle\Entity\Niveaux")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_niveau", referencedColumnName="id_niveau")
* })
*/
private $idNiveau;`
如您所见,我已经有一个“id_utilisateur”字段,该字段是此实体的ID。 以下是XML中实体信息的代码:The XML Code
此处还有我尝试登录时遇到的错误的屏幕截图:The Error
答案 0 :(得分:0)
我认为问题在于按照惯例,id字段通常被称为id,并且在某些地方,FOS UserBundle正好期待这种情况,例如:在UserProvider。
有几种方法可以解决这个问题。例如,你可以编写自己的UserProvder(使用上面链接的那个作为参考),用你的字段替换id。你可能也必须在其他地方这样做。
更简单的解决方案是将您的实体更改为以下内容:
/**
* @var integer
*
* @ORM\Column(name="id_utilisateur", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
public function getId() { return $this->id; }
同样在xml中,这将是这样的:
<id name="id" column="id_utilisateur" type="integer">
<generator strategy="IDENTITY" />
</id>
这种方式在您的实体中,您将使用预期的属性和访问器方法,但在后台它将映射到数据库字段id_utilisateur
,因此您不必对您的任何更改数据库中。
这应该已经解决了你的问题。生成新用户时,Doctrine会自动将地图$user->getId()
带到user_table.id_utilisateur
。如果您现有的代码正在使用旧的get方法,您可以保留它并将其标记为已弃用:
/**
* @deprecated Use getId() instead.
*/
public function getIdUtilisateur()
{
return $this->getId();
}