2017-04-17 57 views
1

當我想在Symfony上使用FOSUserBundle登錄時,我不斷收到錯誤標題。問題是,我已經從我的數據庫中爲我的用戶表創建了一個「id」,所以我不想像他們在FOSUserBundle指南中所要求的那樣創建一個「id」字段。我不明白爲什麼當我的代碼中沒有更多的「id」字段時會給我這個錯誤。無法識別的ID字段與Symfony 3和FOSUserBundle

這個「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

我認爲問題是,按照慣例的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,因此您不必對數據庫進行任何更改。

這應該已經解決了您的問題。當新用戶生成時,原理將自動將地圖$user->getId()改爲user_table.id_utilisateur。如果您現有的代碼正在使用舊的get-method,您可以保留它並將其標記爲已棄用:

/** 
* @deprecated Use getId() instead. 
*/ 
public function getIdUtilisateur() 
{ 
    return $this->getId(); 
} 
+0

謝謝我做到了,它工作正常! –

相關問題