2012-07-04 29 views
2

我遇到了Symfony2安全系統的問題,尤其是在嘗試從數據庫加載角色時。在進一步研究之前,我知道了FOSUserBundle,但目前爲了更好地理解Symfony2框架,我想嘗試使用Symfony2組件工作。 TL; DR - >請不要告訴我只使用FOSUserBundle。 :-)Symfony2:從數據庫加載用戶角色

我在我的捆綁包Accounts,AccountsRoles和AccountsRepository中配置了3個實體。

的src \ RedK \核心\ IndexBundle \實體\ Accounts.php
http://pastebin.com/0VgXvtJp

的src \ RedK \核心\ IndexBundle \實體\ AccountsRoles.php
http://pastebin.com/GiKNnYg3

SRC \ RedK \ Core \ IndexBundle \ Entity \ AccountsRepository.php
http://pastebin.com/SVuMVdpN

的MySQL demo_template.accounts表
http://pastebin.com/YzmjD9e4

的MySQL demo_template.accounts_roles表
http://pastebin.com/Ybwr4f7y

束的所有方面進行了正常工作(登記,確認,密碼復位,登錄)在我嘗試從數據庫添加用戶角色的加載之前。當我通過getRoles(){return array('ROLE_USER')}簡單地將角色設置爲數組('ROLE_USER')時,身份驗證正常運行,用戶成功登錄到站點。

然而,在嘗試將角色從數據庫整合,我收到以下錯誤,我的理解是的AuthenticationException實例:

Notice: Undefined index: id in /home/humplebert/Websites/www/template/vendor/doctrine/lib/Doctrine/ORM/Query/SqlWalker.php line 804 

堆棧跟蹤
http://pastebin.com/Sr5RvZaY

異常僅在修改AccountsRepository中的查詢並刪除「 - > select()」和「 - > leftJoin()」組件時纔會生成。查看pastebin.com鏈接的第16行堆棧跟蹤,看起來我對BasicEntityPersister中的多對多映射發生了各種「瘋狂」的事情。

我已經在我的實體類中搜索高和低的任何參考普通「ID」,並且可以找到沒有。我注意到,如果我將我的實體中的「ID」列的名稱更改爲「id」(即將src \ RedK \ Core \ IndexBundle \ Entity \ Accounts中的「id」替換爲「AccountsID」),錯誤就會發生離開(並被替換爲另一個錯誤,稍後更多)。

問題1)
有什麼blatently錯我的實體是產生「未定義指數:ID」的錯誤我收到?如果沒有,Symfony2/Doctrine2是否要求Auto-Increment列標記爲「id」?

由於我不斷修補,我決定嘗試將我的表ID列重命名爲「ID」。因此,src \ RedK \ Core \ IndexBundle \ Accounts用「id」代替AccountsID。同樣,src \ RedK \ Core \ IndexBundle \ AccountsRoles用「id」代替RolesID。一旦這樣做,「Undefined index:id」錯誤消失。但是,我收到一個新錯誤:"table or view demo_template.accounts_accountsroles does not exist"。當然,它不存在,我沒有一個表被定義爲accounts_accountsroles。我有兩個表,帳戶和accounts_roles。

問題2)
爲了使用Symfony2的/ Doctrine2工具從數據庫中導入用戶的角色,有什麼規則是有關於表的命名?根據我收到的錯誤,似乎正在發生某種形式的連接。或者我只是簡單地把我的註釋搞亂了?

任何幫助將不勝感激。

+0

仍然停留在此錯誤。我附加了兩個數據庫表的MySQL結構,希望能夠幫助我們解決這個問題。 –

+0

你應該把堆棧跟蹤,而不是隻有錯誤(即消息,文件和行...)。 – AdrienBrault

+0

在大多數數據庫(包括MySQL)中,多對多關係需要第三個「聯結」表。如果您沒有在註釋中指定該表的名稱,Symfony會通過連接兩個實體的名稱來生成它 - 因此需要存在accounts_accountsroles表以使您的多對多關係正常工作。可能只是您的數據庫模式已過時,或者您的多對多註釋可能存在問題。 – redbirdo

回答

0

關於問題1)簡短的回答是否定的!對於長的答案見教義Association Mapping文檔中的5.3節映射默認值:

它指出,如果你使用這個簡短的註釋:

/** @ManyToMany(targetEntity="Group") */ 
private $groups; 

「在這種情況下,連接表默認爲名稱參數類的簡單,非限定類名的組合,由下劃線字符分隔,連接列的名稱默認爲目標類的簡單非限定類名稱,後跟「_id」,被引用的字段總是默認爲「id 「,就像在一對一或多對一的映射中一樣。」

您可以通過提供更詳細的多對多註釋來覆蓋默認值(請參閱上面的鏈接),因此可以避免id錯誤。

關於問題2)級聯是正確的。多對多的關係需要第三個「聯結」表。上面的Doctrine段落解釋瞭如何生成此表的名稱。

我不知道爲什麼表'...不存在'錯誤發生的結點表,因爲註釋看起來對我來說確實很好。看起來好像您的數據庫架構與註釋不同步。

0

我實現了一個解決方案,上述FOSUserBundle並描述它here

實現角色的訪問通過量主義,你仍然需要做出RoleHierarchy服務意識到這一點後。

相關問題