2

我遇到了 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 工具从数据库中导入用户角色,关于表的命名有哪些规则?根据我收到的错误,似乎正在发生某种形式的连接。还是我只是简单地在某个地方搞砸了我的注释?

任何帮助将不胜感激。

4

2 回答 2

0

关于问题 1)简短的回答是否定的!有关详细答案,请参阅 Doctrine Association Mapping文档中的第 5.3 节映射默认值:

它指出,如果您使用这个简短的注释:

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

“在这种情况下,连接表的名称默认为参与类的简单、非限定类名的组合,用下划线字符分隔。连接列的名称默认为目标的简单、非限定类名class 后跟“_id”。referencedColumnName 始终默认为“id”,就像在一对一或多对一映射中一样。”

您可以通过提供更详细的多对多注释来覆盖默认值(参见上面的链接),从而避免 id 错误。

关于问题2)串联是正确的。多对多关系需要第三个“联结”表。上面的 Doctrine 段落解释了这个表的名称是如何生成的。

我不知道为什么连接表会出现“表...不存在”错误,因为注释对我来说看起来不错。您的数据库架构似乎与您的注释不同步。

于 2012-07-17T20:49:53.403 回答
0

我在 FOSUserBundle 之上实现了一个解决方案并在此处进行了描述

在通过 Doctrine 实现角色访问之后,您仍然需要让 RoleHierarchy 服务意识到它。

于 2014-07-10T14:18:12.847 回答