4

私はFOSUserBundleでSymfony2.1を使用していて、すべてが完全に機能していますが、問題を解決する方法がわかりません。

基本的に、他のエンティティとの関係を考慮して、データベースからユーザーを検索(ロードまたは取得)する方法があるかどうかを知りたいです。

これは状況です:

ユーザーがソーシャルネットワーク(Google、Facebook、LinkedInなど)を介して自分のサイトにログインできるようにしました。また、オフラインアクセスを依頼するので、いつでもソーシャルアカウントにアクセスできます。

各ユーザーは必要な数の接続を持つことができるため(または、オプションであるために接続がない場合もあります)、この情報をユーザーテーブルに保存しないことにしました。私は「SocialConnection」と呼ばれる抽象的なエンティティを作成しました。これは実際のエンティティ(Google、Facebookなど)によって拡張されています。このエンティティには、ユーザーがこれらのネットワーク(user_id、social_id、access_tokenなど)を介してサイトにログインしたときに取得するユーザー情報を格納するため、Userクラスに、抽象「SocialEngine」のコレクションをマッピングしました。すべてのネットワークを一緒にする。

将来的にツイッターやヤフーなどのネットワークを追加できるようにするためには、そうあるべきだと思います。

したがって、問題は、ユーザーがこれらのソーシャルネットワークのいずれかを介して私のサイトにログインするときに、彼のソーシャルIDを知っているデータベースからユーザーをロードする必要があるということですが、その方法がわかりません。

UserManagerのメソッド$this->findUserByがプロパティに関するユーザーを検索することを確認しましたが、そうではないと思います。

良い解決策を見つけるにはどうすればよいですか?

前もって感謝します。

よろしく、イジー。

4

1 に答える 1

2

これを達成するには、DoctrineのAPIを深く理解する必要があります。基本リポジトリメソッド(find、findByなど)では不十分です。

doctrineの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リレーション関係を作成することもできます。

于 2012-10-14T09:22:56.033 に答える