2011-11-23 10 views
5

Diciamo che ho un User Entità:Come utilizzare il servizio di traduzione all'interno di un'entità?

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

Con questa funzione:

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

Come posso utilizzare il servizio traduttore all'interno di questo Ente di tradurre "Monsieur" e "Madame"?

Sembra che il servizio di traduzione debba essere utilizzato solo all'interno di un Controller, ma penso che sia appropriato in tal caso utilizzarlo all'interno di questa Entità.

risposta

8

Il servizio di traduzione è, come dici tu, un "servizio" che puoi utilizzare un servizio all'interno di qualsiasi classe (ad esempio definendolo anche come servizio e utilizzando il contenitore dell'iniettore delle dipendenze). Quindi, puoi usare il traduttore quasi ovunque tu voglia.

Ma le entità come aldo said non dovrebbero avere questa responsabilità. Nel peggiore scenario, se si vuole veramente di tradurre le cose dentro l'entità, si potrebbe passare il traduttore al soggetto con un metodo set, vale a dire

$entity->setTranslator($translator); 

ma vi consiglio anche di creare una classe che gestisce il problema al di fuori l'entità, ovvero utilizzando il modello di ramoscello

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

Wouah! Non sapevo della {{$ variabile | trans}}. Ho creduto che potesse funzionare solo con testo semplice (e non variabile). Grazie mille ! – lepix

+0

Sì, a proposito, non è necessario il segno $. Ho lavorato con Smarty oggi, in twig: {{variable | trans}} puoi anche tradurre il testo restituito da funzioni, array, ecc. Come: {{app.session.getFlash ('panel_alert'). Msg | trans}} – Silence

4

Non si dovrebbe e in generale non è possibile. Secondo lo Single Responsibility Principle l'entità ha già il suo scopo, che rappresenta i dati su un database. Inoltre la traduzione è una questione di rappresentazione, quindi è improbabile che tu voglia affrontare un tale problema nel livello di entità (a meno che tu non voglia fornire entità tradotte in lingue diverse, che è un problema completamente diverso e non dovrebbe nemmeno essere risolto usando il traduttore).

Ripensare alla tua logica e provare qualcosa di diverso per questo. Sei sicuro di non voler fare questa traduzione sul livello vista? Questa sarebbe la cosa migliore probabilmente. Altrimenti (se la tua logica ha davvero bisogno di avere una traduzione a livello di modello) potresti creare una classe wrapper per entità e una fabbrica per generare queste "entità avvolte"; in quella fabbrica si potrebbe iniettare il servizio di traduzione.

+0

In realtà ho fatto perché di quest'altra mia domanda: http://stackoverflow.com/questions/8174354/on-symfony2- with-doctrine2-does-object-entity Ma capisco cosa hai detto. Grazie :) – lepix

2

Mi sono imbattuto nel problema simile e alla fine ho trovato questa soluzione. Questa non è una risposta diretta al tuo problema perché sono anche consapevole del fatto che un'entità non dovrebbe avere nulla a che fare con un servizio, come il traduttore. Quindi dovresti lasciare intatta la funzione getDesignation. Invece, nel livello di presentazione, per esempio, per esempio, si traduce quella designazione francese.

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

e nella vostra messages.en.yml

Monsieur: Mr. 
Madame: Mrs. 
Problemi correlati