2011-11-23 11 views
5

Digamos que tengo una Entidad User:¿Cómo usar el servicio de traductor dentro de una entidad?

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

Con esta función:

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

¿Cómo puedo utilizar el servicio de traductor dentro de esta Entidad para traducir "señor" y "señora"?

Parece que el servicio del traductor debe usarse solo dentro de un Controlador, pero creo que es apropiado en ese caso usarlo dentro de esta Entidad.

Respuesta

8

El servicio de traducción es, como usted dice, un "servicio", puede utilizar un servicio dentro de cualquier clase (es decir, definiéndolo también como un servicio y utilizando el contenedor del inyector de dependencia). Entonces, puedes usar el traductor casi donde quieras.

Pero las entidades como aldo said no deberían tener esa responsabilidad. En el peor de los casos si realmente desea traducir cosas dentro de la entidad, se puede pasar el traductor a la entidad con un método establecido, es decir,

$entity->setTranslator($translator); 

pero recomiendo que también permite crear una clase que maneja el problema fuera la entidad, es decir, utilizando la plantilla twig

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

¡Wouah! No sabía sobre la {{$ variable | función trans}}. Creí que solo podía funcionar con texto plano (y no variable). Muchas gracias ! – lepix

+0

Sí, por cierto, no necesita el signo $. He estado trabajando con Smarty hoy, en twig: {{variable | trans}} incluso puede traducir texto devuelto por funciones, matrices, etc. como: {{app.session.getFlash ('panel_alert'). Msg | trans}} – Silence

4

No debe y, en general, no es posible. Según el Single Responsibility Principle, la entidad ya tiene su propósito, que representa datos en una base de datos. Además, la traducción es una cuestión de representación, por lo que es poco probable que desee abordar ese problema en la capa de entidad (a menos que desee proporcionar entidades traducidas en diferentes idiomas, lo cual es un problema totalmente diferente y ni siquiera debería resolverse usando el traductor).

Vuelva a pensar en su lógica y pruebe algo diferente para esto. ¿Estás seguro de que no quieres hacer esta traducción en la capa de visualización? Eso sería lo mejor, probablemente. De lo contrario (si su lógica realmente necesita una traducción a nivel de modelo), podría crear una clase contenedora para entidades y una fábrica para generar estas "entidades envueltas"; en esa fábrica podría inyectar el servicio de traducción.

+0

De hecho lo hice porque de esta otra pregunta mía: http://stackoverflow.com/questions/8174354/on-symfony2- with-doctrine2-does-object-entity Pero entiendo lo que dijiste. Gracias :) – lepix

2

Me encontré con el problema similar y finalmente encontré esta solución. Esta no es una respuesta directa a su problema porque también soy consciente de que una entidad no debería tener nada que ver con un servicio, como un traductor. Por lo tanto, debe dejar la función getDesignation intacta. En cambio, en la capa de presentación, ramita, por ejemplo, traduces esa designación francesa.

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

Y en sus messages.en.yml

Monsieur: Mr. 
Madame: Mrs. 
Cuestiones relacionadas