Предположим, у меня есть User
Entity:
$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(); }
Как я могу использовать услугу переводчика внутри этого Entity для перевода «Monsieur» и «Madame»?
Кажется, что услуга переводчика должна использоваться только внутри контроллера, но я думаю, что в этом случае уместно использовать ее внутри этого Entity.
Служба переводчика, как вы говорите, «услуга», вы можете использовать сервис внутри любого класса (т. Е. Определять его как службу и использовать контейнер инжектора зависимостей). Таким образом, вы можете использовать переводчик практически везде, где хотите.
Но сущности, подобные альдо, не должны обладать такой ответственностью. В худшем случае, если вы действительно хотите перевести вещи внутри объекта, вы можете передать переводчику сущность с заданным методом, т. Е.
$entity->setTranslator($translator);
но я также рекомендую вам создать класс, который обрабатывает проблему за пределами объекта, т. е. используя шаблон ветки
{{ entity.property|trans }}).
Вам не следует и вообще невозможно. В соответствии с принципом единой ответственности сущность уже имеет свою цель, которая представляет данные в базе данных. Кроме того, перевод является вопросом представления, поэтому маловероятно, что вы хотите решить эту проблему на уровне сущности (если вы не хотите предоставлять объекты, переведенные на разные языки, что совершенно другая проблема, и ее даже не нужно решать, используя переводчик).
Переосмыслите свою логику и попробуйте что-то другое для этого. Вы уверены, что не хотите выполнять этот перевод на уровне представления? Вероятно, это было бы лучше. В противном случае (если ваша логика действительно должна иметь перевод на уровне модели), вы можете создать класс-оболочку для сущностей и фабрику для создания этих «завернутых объектов»; на этом заводе вы можете ввести услугу переводчика.
Я столкнулся с подобной проблемой и, наконец, нашел это решение. Это не прямой ответ на вашу проблему, потому что я также знаю, что сущность не должна иметь ничего общего с сервисом, например, с переводчиком. Поэтому вы должны оставить функцию getDesignation нетронутой. Вместо этого, в слое презентации, например, ветка, вы переводите это французское обозначение.
<div>{% trans %}{{ entity.designation }}{% endtrans %} {{ entity.name }}</div>
И в ваших сообщениях.en.yml
Monsieur: Mr. Madame: Mrs.