Symfony2:如何考虑其映射实体加载用户?

时间:2012-10-12 23:46:01

标签: symfony fosuserbundle

虽然我正在使用带有FOSUserBundle的Symfony 2.1并且一切正常,但我不知道如何解决问题。

基本上,我想知道是否有办法从数据库中找到(加载或获取)用户,同时考虑到与另一个实体的关系。

情况就是这样:

我已经让用户也可以通过社交网络(Google,Facebook,LinkedIn等)登录我的网站。我还要求他们进行离线访问,这样我就可以随时访问他们的社交帐户了。

由于每个用户可以拥有任意数量的连接(或者可能没有,因此他们是选项),我决定不将这些信息保存在用户表中。我创建了一个名为“SocialConnection”的抽象实体,它由真实的(Google,Facebook等)扩展。在这个实体中,我存储了当用户通过这些网络(user_id,social_id,access_token等)登录我的网站时获得的用户信息,所以在我的User类中,我已经映射了一个抽象的“SocialEngine”集合,它允许我将所有网络放在一起。

为了能够在未来添加其他网络,如Twitter,Yahoo等,我认为应该如此。

所以,现在的问题是,当用户通过任何这些社交网络登录我的网站时,我需要从数据库中加载他知道他的社交ID,但我不知道该怎么做。

我已经看到UserManager的方法$ this-> findUserBy找到了一个关于属性的用户,但我认为情况并非如此。

我该怎么做才能找到一个好的解决方案?

提前致谢。

祝你好运, 的Izzy。

1 个答案:

答案 0 :(得分:2)

要实现这一目标,你需要深入了解教义的api。基础存储库方法(find,findBy等......)是不够的。

您需要使用doctrine's DQL。它看起来像SQL,但您根据映射元数据进行查询,而不是直接基于数据库模式进行查询。

如果您的用户对OneToMany$socialAccounts SocialEngine个属性。您将能够执行以下操作:

SELECT u
FROM Bundle:User AS u
JOIN u.socialAccounts AS sa
WHERE sa.id = 34

但是您只能查询SocialEngine的属性,而不能查询子类的属性...(即:您无法查询SocialFacebookEngine的facebookId)。

您必须将所有twitter / facebook / etc数据放在SocialEngine类的基础User类中。 或者您可以为每个“社交引擎”创建一个实体,并在每个引擎和用户之间创建一个OneToOne关系关系。