2016-09-08 7 views
2

My UserエンティティはUserInterfaceを実装しており、したがってgetRoles()メソッドを提供しています。私のシステムでは、Userは複数のGroupに属します。グループは複数のロールを持つことができます。したがって、ユーザーの役割は、すべてのグループを収集し、それらのグループの役割のリストをマージすることによって判断できます。 FOSUserBundleと同じことが可能です。Symfony2:ユーザエンティティのグループの役割を取得しますが、エンティティ内のクエリは避けてください

最も簡単なアルゴリズムは次のようになります。

public function getRoles() 
{ 
    $roles = $this->roles; 
    foreach ($this->getGroups() as $group) { 
     $roles = array_merge($roles, $group->getRoles()); 
    } 
    return array_unique($roles); 
} 

私はそれがひどく拡大するので、この解決策には問題があると思います。グループごとに新しいクエリーを実行する必要があるため、クエリーの量はグループの数によって異なります。

私は通常、ユーザーのすべてのグループを収集し、グループの役割に参加する単一のクエリを定義することでこれを解決します。その場合、UserエンティティからUserRepository(または直接Doctrineクエリを作成する)を呼び出す必要があり、それは悪い習慣だと私は信じています。

したがって、単一の結合クエリのパフォーマンス上の利点を維持しながら、この悪い習慣を回避するにはどうすればよいですか?

(今回は他の類似した状況があるかどうかはわかりませんが、通常そういう方法をリポジトリに提供するのでこの場合、UserInterfaceはエンティティ内に存在する必要があります)

答えて

1

これを行う最も簡単な方法は、カスタムUserProviderを作成することです。

http://symfony.com/doc/current/security/custom_provider.html#create-a-user-providerを参照してください。

このユーザー・プロバイダの内部では、ユーザー名からユーザーを選択してグループ・エンティティに結合を追加する必要があるため、1つの問合せしか持たないようにしてください。

関連する問題