2012-11-08 40 views
1

我使用Symfony2與Doctrine2。我要實現以下目標:來自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(...); 
    } 
} 

你會怎麼做?你能否詳細解釋一下我要創建&的步驟和新課程?我打算一旦準備好就發佈這個翻譯包:)

謝謝!

+0

你能解釋一下爲什麼你首先想要做到這一點嗎?在一個正常的MVC架構中,像locale這樣的東西將是Controller和View的責任,而不是Model。我想知道是否有更好的方法來做你想做的事情? –

+0

@ tomtheman5剛剛更新了問題。謝謝! – fesja

回答

1

我不認爲Doctrine是訪問會話數據的好方法。 ORM的開銷太多,只能提取會話數據。

檢查出Symfony 2 Cookbook配置PDO支持的會話。

而不是建立一項服務,我會考慮使用Doctrine event listener的方法。在每次查找之前,聽衆會從某處(會話,配置或任何其他您將來喜歡的地方)挑選出正確的語言環境,將其注入查詢中,並且像魔術一樣,您的模型不必知道這些細節。保持模型範圍清潔。

您不希望您的模型或存儲庫直接跨越到會話中。如果您以後決定要使用該存儲庫的命令行工具,該怎麼辦?隨着所有的會議在那裏,你會有一個爛攤子。

主義事件聽衆神奇美味。他們需要做一些實驗,但他們最終成爲這種查詢操作的一種非常可配置的,不合適的解決方案。

更新:看起來你最喜歡的是Doctrine Translatable Extension。它在註冊偵聽器方面爲您完成了所有工作,爲如何傳遞適當的語言環境(無論您在哪裏保留它)提供鉤子,等等。我自己使用了Gedmo擴展(雖然不是這個特定的擴展),並且發現它們都是高質量的。

+1

感謝Clay,但是在執行查詢之前,我找不到Doctrine事件偵聽器。我發現堅持,齊平,但沒有preQuery,preSelect,preLookup ... – fesja

+0

@fesja我更新了答案與一個額外的鏈接。如果您覺得有幫助,請投票給我的答案。謝謝! –

+0

我正在嘗試爲該Translatable Extension創建一個替代方案,因爲我不喜歡它是如何完成的。我需要每個對象語言一行。該擴展名爲每個已翻譯字段創建一行。因此,如果我有3種語言和6個字段進行翻譯,我只需要3行,而不是18個。擴展效率不高。 – fesja