2012-11-08 2 views
1

Doctrine2에 Symfony2를 사용하고 있습니다. (세션) 사용자의 언어에 장소의 정보 (공통 데이터 + 문자를)입니다EntityRepository의 세션 액세스

$place = $this->getDoctrine()->getRepository('TETestBundle:Place')->find($id); 

그리고 그 장소에 : 나는 다음과 달성하고자합니다. 내가 수백 번 그렇게하려고 할 때, 저는 두 번째 매개 변수가 아닌 장면 뒤에서 그것을 전달하고 싶습니다. 영어 사용자는 영어로 장소 정보를, 스페인어로 스페인어 사용자를 봅니다.

하나의 가능성은 EntityRepository에서 앱의 로케일에 액세스하는 것입니다. 나는 그것이 서비스와 DI로 끝났음을 안다. 그러나 나는 그것을 이해할 수 없다!

// PlaceRepository 
class PlaceRepository extends EntityRepository 
{ 
    public function find($id) 
    { 
     // get locale somehow 
     $locale = $this->get('session')->getLocale(); 

     // do a query with the locale in session 
     return $this->_em->createQuery(...); 
    } 
} 

어떻게 하시겠습니까? & 확장 단계와 새로운 클래스를 약간 자세하게 설명해 주시겠습니까? 한 번 준비가되면이 번들 번들을 출시 할 계획입니다. :)

Thanks!

+0

왜 처음에이 작업을하려는 이유에 대해 설명 할 수 있습니까? 일반적인 MVC 아키텍처에서 로케일과 같은 것들은 모델이 아닌 컨트롤러와 뷰의 책임입니다. 네가하려는 일을하는 더 좋은 방법이 있을지 궁금하다. –

+0

@ tomtheman5 님이 질문을 업데이트했습니다. 감사! – fesja

답변

1

나는 Doctrine이 세션 데이터에 접근하는 좋은 방법이라고 생각지 않는다. ORM에 세션 데이터를 가져 오는 오버 헤드가 너무 많습니다.

PDO 지원 세션의 구성은 Symfony 2 Cookbook을 확인하십시오.

서비스를 설정하는 대신 Doctrine event listener을 사용한 방법을 고려해 보겠습니다. 각 조회 전에 리스너는 어딘가에 (세션, 설정 또는 앞으로 좋아할 다른 장소) 올바른 로케일을 선택하여 쿼리에 삽입하고 마술처럼 모델에있는 것을 알 필요가 없습니다. 세부. 모델의 범위를 깨끗하게 유지합니다.

모델이나 저장소가 세션에 직접 건너 뛰는 것을 원하지 않습니다. 앞으로 리포지토리가있는 명령 줄 도구를 원한다고 결정한다면 어떻게 될까요? 그 모든 세션 벼락치기로, 당신은 엉망이 될거야.

Doctrine 이벤트 리스너는 마술처럼 맛있습니다. 그들은 약간의 실험을하지만, 이러한 종류의 쿼리 조작에 대한 매우 구성이 자유로운 out-of-the-way 솔루션입니다.

업데이트 : 가장 큰 혜택을 보는 사람은 Doctrine Translatable Extension입니다. 청취자를 등록하는 것과 관련하여 적절한 로케일을 전달하는 방법에 대한 후크를 제공하는 등 모든 작업을 수행했습니다. 나는 Gedmo 확장 기능을 직접 사용해 왔지만 (이 특별한 기능은 아니지만), 이들 모두를 고품질로 발견했다.

+1

Clay에게 감사하지만 쿼리가 실행되기 전에 Doctrine 이벤트 리스너를 찾을 수 없습니다. 나는 계속 찾아 냈지만, 아무런 사전 쿼리, preSelect, preLookup ... – fesja

+0

@fesja 나는 추가 링크로 대답을 업데이트했다. 도움이된다면 제 대답을 올려주세요. 감사! –

+0

Translatable Extension에 대한 대안을 만들고 싶습니다. 왜냐하면 나는 그것이 어떻게 행해지는 것을 싫어하기 때문입니다. 객체 - 언어 당 하나의 행이 필요합니다. 이 확장은 번역 된 필드 당 행을 만듭니다. 따라서 번역 할 언어와 필드가 3 개라면 18 개가 아니라 3 개의 행이 필요합니다. 확장이 효율적이지 않습니다. – fesja