2011-11-23 42 views
5

比方說,我有一個User實體:如何在實體內部使用翻譯服務?

$user = new User(007); 
echo $user->getName(); // display Bond 
echo $user->getGender(); // display "Male"; 
echo $user->getDesignation() // display "Monsieur Bond" or "Mister Bond" 

有了這個功能:

public function getDesignation() { 
    if ($this->getGender() == 'Male') return "Monsieur ".$this->getName(); 
    else return "Madame ".$this->getName(); 
} 

我如何使用這個實體內的翻譯服務,以「先生」和「夫人」翻譯?

看起來翻譯服務應該只在控制器內部使用,但我認爲在這種情況下在這個實體內部使用它是適當的。

回答

8

翻譯服務就像你說的那樣是一個「服務」,你可以在任何類中使用一個服務(即定義服務也是使用依賴注入容器)。所以,你幾乎可以在任何你想要的地方使用翻譯器。

但像aldo said這樣的實體不應具有該責任。如果您真的想給實體內翻譯的事情最壞的情況下,你可以翻譯傳遞給實體一套方法,即

$entity->setTranslator($translator); 

但我建議你也可以創建外處理這個問題的一類該實體,即使用樹枝模板

{{ entity.property|trans }}). 
+1

Wouah!我不知道{{$ variable | trans}}函數。我相信它只能用純文本(而不是可變的)工作。非常感謝你 ! – lepix

+0

是的,順便說一句,你不需要$符號。今天,我一直在使用Smarty,在twig中:{{variable | trans}}你甚至可以翻譯從函數,數組等返回的文本,如: {{app.session.getFlash('panel_alert')。msg |反式}} – Silence

4

你不應該在一般情況下這是不可能的。根據Single Responsibility Principle該實體已經有了他們的目的,它表示數據庫上的數據。此外,翻譯是一種表示的問題,因此您不想在實體層中解決這樣的問題(除非您希望提供以不同語言翻譯的實體,這完全是一個不同的問題,甚至不應該用翻譯者)。

重新思考你的邏輯,並嘗試不同的東西。你確定你不想在視圖層上做這個翻譯嗎?這可能是最好的事情。否則(如果你的邏輯真的需要在模型層面進行翻譯),你可以爲實體和工廠創建一個包裝類來生成這個「包裝實體」;在那個工廠你可以注入翻譯服務。

+0

其實我沒有,因爲我的這另一個問題如此:http://stackoverflow.com/questions/8174354/on-symfony2- with-doctrine2-does-object-entity 但我明白你的意思。謝謝:) – lepix

2

我碰到類似的問題,並最終找到了這個解決方案。這不是對你的問題的直接回答,因爲我也知道一個實體應該與服務無關,比如翻譯器。所以你應該保持getDesignation函數不變。相反,在表示層中,例如,樹枝,您翻譯該法文名稱。

<div>{% trans %}{{ entity.designation }}{% endtrans %} {{ entity.name }}</div> 

而在你messages.en.yml

Monsieur: Mr. 
Madame: Mrs.