Wie zu verwenden der übersetzer-service innerhalb einer Entität?
Sagen wir, ich habe eine User
Person :
$user = new User(007);
echo $user->getName(); //display Bond
echo $user->getGender(); //display "Male";
echo $user->getDesignation() //display "Monsieur Bond" or "Mister Bond"
Mit dieser Funktion :
public function getDesignation() {
if ($this->getGender() == 'Male') return "Monsieur ".$this->getName();
else return "Madame ".$this->getName();
}
Wie kann ich den übersetzer-Dienst in dieser Einheit zu übersetzen "Monsieur" und "Madame" ?
Scheint es das translator-Dienst sollte verwendet werden, nur innerhalb eines Controllers, aber ich denke, es ist angebracht, in diesem Fall verwenden Sie es innerhalb dieser Entität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Übersetzer-Dienst ist, wie Sie sagen, ein "service" können Sie einen service innerhalb einer Klasse (D. H. definieren es auch als service an und mit dem dependency injector container). So können Sie verwenden Sie den übersetzer, fast wo Sie wollen.
Aber die Personen wie aldo sagte nicht haben sollte, die Verantwortung. Im schlimmsten Szenario, wenn Sie wirklich wollen, um zu übersetzen, was im inneren der Person, die Sie nicht passieren konnten, die übersetzer, um die Entität mit einer set-Methode, D. H.
aber ich empfehle dir auch, eine Klasse zu erstellen, mit der das problem außerhalb der Person, d.h. über die twig template
Sollte man nicht und es ist im Allgemeinen nicht möglich. Nach der Prinzip Der Einzigen Verantwortung die Entität, die haben schon Ihren Zweck, die Repräsentation der Daten in einer Datenbank. Außerdem ist die übersetzung, ist eine Frage der Darstellung, so ist es unwahrscheinlich, dass Sie ansprechen möchten, wie ein problem in der entity-Schicht (es sei denn, Sie möchten Entitäten übersetzt in verschiedene Sprachen, die etwas ganz anderes problem und sollte auch nicht gelöst werden mit Hilfe der übersetzerin).
Überdenken, um Ihre Logik und versuchen, etwas anders. Sind Sie sicher, dass Sie nicht wollen, zu tun, diese übersetzung auf die view-Schicht? Das wäre das beste wahrscheinlich. Ansonsten (wenn deine Logik wirklich brauchen, um eine übersetzung zu einem Modell-Ebene) könnte man erstellen Sie eine wrapper-Klasse für die Personen und eine Fabrik zur Erstellung dieses "solide Unternehmen"; in diesem Werk könnten Sie injizieren die übersetzer-service.
Ich lief in das gleiche problem haben, und schließlich fand diese Lösung. Dies ist keine direkte Antwort auf dein problem, da bin ich mir auch bewusst, das ein Unternehmen haben sollte nichts zu tun mit einem Dienst, wie übersetzer. So sollten Sie verlassen die getDesignation Funktion unberührt. Statt, in der Präsentations-Schicht, Zweig, zum Beispiel, Sie zu übersetzen, dass die französische Bezeichnung.
Und in Ihren Nachrichten.de.yml
Ich lief in dieses problem mehrere Male im Laufe der letzten Jahre und immer noch gut genug umgehen. Hier mal meine
getIdentifyingName()
Methoden, die Häufig verwendet im gesamten Projekt (wie eine explizite__toString()
) übersetzen musste, einige Schlüsselwörter verwendet in der Daten-Ebene, so gab es keinen eleganten workaround.Meine Lösung zu diesem Zeitpunkt ist ein
TranslateObject
und eine entsprechende helper-Dienst. DieTranslateObject
ist ein einfaches Objekt holding übersetzung-Taste und eine Reihe von Platzhaltern, die auch TranslateObjects zu erlauben, multi-level-übersetzung (wie eingetIdentifyingNameTranslateObject()
Aufruf einer anderen zugehörigen ObjektsgetIdentifyingNameTranslateObject()
innerhalb der Platzhalter):Den Helfer sieht wie folgt aus und funktioniert:
Und dann innerhalb der Einheit gibt es eine
getIdentifyingNameTranslateObject()
Methode der Rückkehr eineTranslateObject
.Wenn ich wieder so eine übersetzt Eigenschaft, die ich brauchen Zugang zu meinem injiziert
TranslateObjectHelper
service und nutzen Sie Ihretrans()
Methode wie in einem controller oder jede andere Dienstleistung:Dann erstellte ich einen Zweig filter als einfache Helfer wie diese:
So, in Twig kann ich übersetzen wie diese:
Bin ich am Ende "nur" benötigt, um zu finden, die alle
getIdentifyingName()
Anrufe (oder.identifyingName
im Zweig) auf, dass Unternehmen, und ersetzen Sie Sie mitgetIdentifyingNameTranslateObject()
mit einem Aufruf an dietrans()
Methode derTranslateObjectHelper
(oder dietranslateObject
- filter in Twig).