Symfony2:从数据库加载用户角色

时间:2012-07-04 08:53:12

标签: symfony doctrine-orm

我遇到了Symfony2安全系统的问题,特别是在尝试从数据库加载角色时。在进一步研究之前,我知道FOSUserBundle,但目前为了更好地理解Symfony2框架,我想尝试仅使用Symfony2组件使我的bundle工作。 TL; DR - >请不要告诉我只使用FOSUserBundle。 : - )

我在我的捆绑包中配置了3个实体,Accounts,AccountsRoles和AccountsRepository。

SRC \ RedK \核心\ IndexBundle \实体\ Accounts.php
http://pastebin.com/0VgXvtJp

SRC \ RedK \核心\ IndexBundle \实体\ AccountsRoles.php
http://pastebin.com/GiKNnYg3

SRC \ RedK \核心\ IndexBundle \实体\ AccountsRepository.php
http://pastebin.com/SVuMVdpN

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

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

在我尝试从数据库添加用户角色加载之前,捆绑包的所有方面都正常工作(注册,确认,密码重置和登录)。当我通过getRoles(){返回数组('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行附近的Stack Trace时,看起来我对BasicEntityPersister中的多对多映射发生了各种各样的“疯狂”。

我在我的Entity类中搜索过高和低,以获取对“id”的任何引用,并且找不到任何内容。我注意到,如果我将实体中“ID”列的名称更改为“id”(即在src \ RedK \ Core \ IndexBundle \ Entity \ Accounts中将“AccountsID”替换为“id”),则错误消失离开(并被替换为另一个错误,稍后更多)。

问题1)
我的实体是否存在一些与我生成的“Undefined index:id”错误有关的错误?如果没有,Symfony2 / Doctrine2是否要求将自动增量列标记为“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工具从数据库导入用户角色,有关表的命名的规则是什么?基于我收到的错误,似乎正在发生某种形式的连接。或者我只是简单地把我的注释搞砸了?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

它声明如果你使用这个简短的注释:

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

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

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

关于问题2)连接是正确的。许多关系需要第三个“交叉”表。上面的Doctrine段落解释了如何生成此表的名称。

我不知道为什么'table ...不存在'错误发生在联结表中,因为注释对我来说没问题。看起来好像您的数据库架构与注释不一致。

答案 1 :(得分:0)

我在FOSUserBundle之上实现了一个解决方案,并将其描述为here

通过Doctrine实现角色访问后,您仍然需要让RoleHierarchy服务了解它。