2012-02-02 6 views
0

에서 나는 개체의 관계를 통해 tanslatable 동작을 구현했습니다, 그래서 내가 topic_id, LANG_CODE 및 콘텐츠와 topic_i18nOneToMany 관계와 ID 속성을 가진 topic 개체가 있습니다.는 한 번

개인 $ 로캘을 설정할 수 있습니까? 속성을 topic 엔티티로 만들려면 토픽의 엔티티를 만들려면 __toString() 메서드를 사용하여 내용/이름 또는 무엇이든 topic_i18n 엔티티를 표시 하시겠습니까? 어떻게 그럴 수 있습니까 ? 내가 먼저 작성해야하거나 새로운 topic_i18n 개체를 삽입 할 때

OneToMany 관계가 발생하는 어떤 상황에 확장 할 수 있습니다 내가 가지고있는 또 다른 의심의 여지가, 현재 topic 개체가 다음 국제화를 만드는 것입니다. 나는 엔티티 서비스 레이어/관리자와 경험이 없지만 나는 패러다임을 사용하여 두 엔티티를 하나로 관리 할 수 ​​있다고 생각하지만 계속 진행하는 방법을 모르거나 갈 방법이 올바른지를 모릅니다. 어떤 사람은 자신의 경험을 바탕으로 힌트, 의견 또는 어떤 것을 줄 수 있습니까?

고맙습니다.

PD : 나는 교리 행동 번들에 대해 알고 있지만, 지금은 가능성이 없습니다.

답변

3

당신이 해낸 방식이 꽤 좋다고 생각합니다.

getTitle ($ locale) (또는 get * Whatever *)과 같은 i18n 데이터를 얻기 위해 topic_i18n 컬렉션에서 좋은 값을 찾는 로직을 추가하는 몇 가지 메소드를 추가/재정의 할 수 있습니다. __toString 또는 다른 사람의 자동화

// in your Topic class 
public function getTitle() 
{ 
    return $this 
     ->getTopicI18nCollection() 
     ->findByLocale($this->getLocale()) // actually findByLocale does not exist, you will have to find another way, like iterating over all collection 
     ->getTitle() 
    ; 
} 

문제는 로케일 전환, 또는 방법을 기본적으로 사용할 수있는 기본 로케일을 정의하는과이다.

이것은 요청이나 세션 정보를 사용하여 EntityManager가 가져온 엔티티 (http://www.doctrine-project.org/docs/orm/2.1/en/reference/events.html#lifecycle-events)에 현재 로케일을 설정하는 doctrine postLoad 이벤트 리스너를 사용하여 해결할 수 있습니다.

symfony2를 사용하여, 그것은 다음과 같을 수 있습니다 :

# app/config/config.yml 
services: 
    postload.listener: 
     class: Translatable\LocaleInitializer 
     arguments: [@session] 
     tags: 
      - { name: doctrine.event_listener, event: postLoad } 


// src/Translatable/LocaleInitalizer.php 
class LocaleInitializer 
{ 
    public function __construct(Session $session) 
    { 
     $this->session = $session; 
    } 

    public function postLoad(LifecycleEventArgs $args) 
    { 
     $entity = $args->getEntity(); 
     if ($entity implements TranslatableInterface) { // or whatever check 
      $entity->setLocale($this->session->getLocale()); 
     } 
    } 
} 

을 그리고 마지막으로, 당신은 새로운 topic_i18n 객체를 생성하기 위해 주제 개체를 가져을하지 않아도, 당신은 단순히 독립적으로 국제화 (i18n) 개체를 삽입 할 수 있습니다 . (하지만 이전에 가져온 콜렉션을 새로 고침해야합니다).

+0

고마워, 네 설명은 내가 찾고 있던거야! findByLocale()이 존재하지 않는 이유를 설명해 주시겠습니까? 로케일이 @ORM \ column 대신 개인 var이 되었습니까? 내가 가진 또 다른 질문은 하나의 서비스 레이어/관리자를 만들거나 Topic 엔터티에 필요한 필드/vars를 추가하고 prepersist 이벤트에 리스너를 등록하고 거기에서 vars를 Entity에서 가져 오는 두 엔터티를 모두 관리 할 수 ​​있도록하기 위해서입니다. Entity_i18n 객체를 인스턴스화하고 객체를 설정합니다. 나는 $ t = new Topic(); $ t-> setLocale ('es'); $ t-> setContent (foo);를 실행할 수 있기를 원한다. 지속되다 – user846226