2012-02-02 11 views
0

一度私は、エンティティの関係を通じてtanslatable振る舞いを実装しましたので、私はtopic_idとtopic_i18nOneToMany関係、 LANG_CODEおよびコンテンツにidプロパティでtopic実体を持っています。の管理複数のエンティティは、OneToManyの関係で、

プライベート$ロケールを設定できますか。プロパティをtopicエンティティにするにはトピックのエンティティを__toString()メソッドでコンテンツ/名前などを表示させるにはtopic_i18nエンティティから何かを入力しますか?どうすれば実現できますか? 私が最初に作成する必要があるか 新しいtopic_i18nオブジェクトを挿入したい場合

OneToMany関係が発生した任意のコンテキストに拡張することができ、私が持っているもう一つの疑問は、現在topicオブジェクトを持って、その後、国際化を作成しています。私はエンティティサービスレイヤー/マネージャーに経験はありませんが、私は 両方のエンティティを1つとして管理できるというパラダイムを使うことができると思いますが、進める方法がわからないか、それとも正しい方法だと思います。彼の経験に基づいてヒント、意見、または何かを与えることができますか?

ありがとうございました!

PD:教義行動バンドルについて知っていますが、今は可能性がありません。

答えて

3

あなたのやり方はかなり良いと思います。

getTitle($ locale)(またはget * Whatever *)などのi18nデータを取得するいくつかのメソッドを追加/上書きできます。これにより、topic_i18nコレクションの適切な値を見つけるロジックが追加されます。

// 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() 
    ; 
} 

__toString等の自動化の問題は、ロケールの切り替え、またはどのようにデフォルトで使用するデフォルトのロケールを定義することです。

これは、リクエストやセッション情報などを使用して、現在のロケールを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オブジェクトを作成するには、トピックのオブジェクトを取得するを持っていない、あなたは単にindependantly国際化オブジェクトを挿入することができます。 (ただし、以前にフェッチされたコレクションをリフレッシュする必要があります)。

+0

ありがとう、あなたの説明は私が探していたものです! findByLocale()が存在しない理由を説明できますか?それはロケールが@ORM \列の代わりにプライベートなvarなのか?私が持っているもう一つの質問は、両方のエンティティを1つのサービスレイヤー/マネージャーを作成するか、必要なフィールド/ varsをTopicエンティティーに追加し、プリスパスストールイベントにリスナーを登録してそこからエンティティEntity_i18nオブジェクトをインスタンス化し、それをオブジェクトに設定しますか?私は$ t = new Topic(); $ t-> setLocale( 'es'); $ t-> setContent(foo);を実行できるようにすることを意味します。持続する – user846226

関連する問題