Was ist der Unterschied zwischen der Verwendung von $ this-> t ('text') und t ('text') in einem Block-Plugin?

7

Ich habe in vielen Tutorials zum Erstellen von Block-Plugins bemerkt,

$this->t('text')

wird verwendet, um übersetzbaren Text zu erstellen, insbesondere in der Blockformularfunktion. Jedoch mit

t('text') 

erzeugt keine Fehler. Gibt es einen Unterschied zwischen diesen beiden? Und wenn nicht, was ist die beste Vorgehensweise?

Matt
quelle

Antworten:

6

Um genau zu sein: Bei der internen Implementierung gibt es keinen Unterschied .

Als bewährte Methode sollten Sie jedoch nach Möglichkeit $this->tanstelle der globalen tMethode verwenden. Wenn Sie die Funktion überprüfen, twird ein neues TranslateableMarkup-Objekt zurückgegeben .

Wenn Ihre Klasse sagt, dass $this->tnicht definiert ist, können Sie das StringTranslationTrait hinzufügen, um das Verhalten hinzuzufügen, oder es als Abhängigkeit einfügen .

Wenn Sie dieses Merkmal verwenden, werden der Klasse die Methoden t () und formatPlural () hinzugefügt. Diese müssen für jede übersetzbare Zeichenfolge verwendet werden, ähnlich wie der prozedurale Code die globalen Funktionen t () und \ Drupal :: translation () -> formatPlural () verwenden muss. Auf diese Weise können Tools zum Extrahieren von Zeichenfolgen übersetzbare Zeichenfolgen finden.

Wenn die Klasse in der Lage ist, Dienste aus dem Container zu injizieren, sollte sie den Dienst 'string_translation' injizieren und ihn $ this-> stringTranslation zuweisen.

Als Best-Practice-Regel möchten Sie im Allgemeinen keine Prozeduren innerhalb von OOP mischen, es sei denn, dies ist vollständig unvermeidbar (z. B. native PHP-Funktionen).

Kevin
quelle
4

In der Dokumentation zu t () heißt es:

Wenn möglich, verwenden Sie die \Drupal\Core\StringTranslation\StringTranslationTrait::t(). Andernfalls erstellen Sie \Drupal\Core\StringTranslation\TranslatableMarkupdirekt ein neues Objekt.

Der Grund dafür wird nicht erläutert. Wenn Sie sich jedoch den Kommentar auf der Dokumentationsseite ansehen , erhalten Sie einen Grund für die Verwendung dieser Merkmalsmethode oder dieser Klasse.

Klassen können einzeln mit PHPUnit getestet werden, das ohne Bootstrapping-Core ausgeführt wird. Die t()Funktion ist jedoch nur verfügbar, wenn der Core gebootet ist.
Mit $this->t()und StringTranslationTraitkann die Übersetzung verspottet werden, sodass die Klasse isoliert mit PHPUnit getestet werden kann.

kiamlaluno
quelle