Symfony 3和FOSUserBundle无法识别的id字段

时间:2017-04-17 10:14:48

标签: php symfony doctrine-orm orm fosuserbundle

当我想使用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

1 个答案:

答案 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();
}