내 User
엔티티 UserInterface
는 getRoles()
방법을 구현 하고 제공합니다 . 내 시스템에서 a User
는 여러에 속할 수 있습니다 Group
. 그룹은 여러 역할을 가질 수 있습니다. 따라서 사용자의 역할은 모든 그룹을 수집하고 해당 그룹의 역할 목록을 병합하여 결정할 수 있습니다. FOSUserBundle에서도 같은 일이 가능합니다 .
가장 쉬운 알고리즘은 다음과 같습니다.
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
return array_unique($roles);
}
이 솔루션은 확장 성이 좋지 않기 때문에 문제가 있다고 생각합니다. 각 그룹에 대해 새 쿼리를 실행해야하므로 쿼리 양은 그룹 수에 따라 다릅니다.
일반적으로 사용자의 모든 그룹을 수집하고 그룹의 역할에 참여하는 단일 쿼리를 정의하여이 문제를 해결합니다. 이를 위해서는 엔터티 UserRepository
에서 호출 (또는 직접 교리 쿼리 작성) User
이 필요하며 이는 나쁜 습관이라고 생각합니다.
그렇다면 단일 조인 쿼리의 성능 이점을 유지하면서 이러한 나쁜 관행을 어떻게 피할 수 있습니까?
(이번에는 적합한 질문 제목을 찾기가 매우 어려웠습니다. 다른 유사한 상황이 있는지 확실하지 않지만 일반적으로 저장소 자체에서 그러한 방법을 제공하기 때문에 그렇게 생각하지 않습니다. UserInterface
엔터티에 있어야하는 경우 )
이를 수행하는 가장 쉬운 방법은 사용자 정의 UserProvider를 만드는 것입니다.
설명서 는 http://symfony.com/doc/current/security/custom_provider.html#create-a-user-provider 를 참조 하십시오 .
이 사용자 공급자 내에서 사용자 이름에서 사용자를 선택하고 그룹 엔터티에 조인을 추가하는 쿼리를 만들어야하므로 쿼리가 하나만 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다