我遇到了 Symfony2 安全系统的问题,特别是在尝试从数据库加载角色时。在继续之前,我知道 FOSUserBundle,但目前,为了更好地理解 Symfony2 框架,我想尝试让我的包仅使用 Symfony2 组件工作。TL;DR -> 请不要告诉我只使用 FOSUserBundle。:-)
我的包中配置了 3 个实体,即 Accounts、AccountsRoles 和 AccountsRepository。
src\RedK\Core\IndexBundle\Entity\Accounts.php
http://pastebin.com/0VgXvtJp
src\RedK\Core\IndexBundle\Entity\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') } 简单地将角色设置为 array('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 中将“AccountsID”替换为“id”),则会出现错误离开(并被另一个错误取代,稍后会详细介绍)。
问题 1)
我的实体是否存在明显错误,以生成我收到的“未定义索引:id”错误?如果没有,Symfony2/Doctrine2 是否要求将 Auto-Increment 列标记为“id”?
随着我继续修补,我决定尝试将我的表 ID 列重命名为“id”。因此, src\RedK\Core\IndexBundle\Accounts 将 AccountsID 替换为“id”。同样, src\RedK\Core\IndexBundle\AccountsRoles 将 RolesID 替换为“id”。这样做后,“未定义索引:id”错误就会消失。但是,我遇到了一个新错误:"table or view demo_template.accounts_accountsroles does not exist"
. 当然它不存在,我没有定义为accounts_accountsroles 的表。我有两个表,accounts 和 accounts_roles。
问题 2)
为了使用 Symfony2/Doctrine2 工具从数据库中导入用户角色,关于表的命名有哪些规则?根据我收到的错误,似乎正在发生某种形式的连接。还是我只是简单地在某个地方搞砸了我的注释?
任何帮助将不胜感激。