Best Practice: $ this-> t () versus t ()

10

Ich suche nach einer Best Practice: Sollten beigesteuerte Module verwenden $this->t()oder t()?

Wim Mostrey
quelle
Ich bevorzuge die Verwendung von StringTranslationTrait: t, da es einfacher ist, den string_translationDienst zu verspotten .
mradcliffe

Antworten:

23

Die beste Vorgehensweise hängt davon ab, wo der Code platziert wird.

OOP-Code

Verwenden Sie $this->t().

Wenn Sie eine Drupal-Basisklasse wie einen Controller oder ein Plugin erweitern, wird die Funktion t () standardmäßig als Klassenmethode bereitgestellt, $this->t()und Sie sollten sie verwenden. Dies macht Ihren Code testbar.

Für die meisten Aufgaben finden Sie eine geeignete Drupal-Klasse, von der aus $this->t()definiert werden kann. Wenn Sie jedoch Ihre eigene Klasse von Grund auf neu erstellen müssen, empfiehlt es sich, das Merkmal für die Zeichenfolgenübersetzung zu verwenden und dieses als Dienst einzufügen, wenn Sie diese Klasse in verwenden ein Service-Kontext:

use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
class MyClass {
  use StringTranslationTrait;

  /**
   * Constructs a MyClass object.
   *
   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
   *   The string translation service.
   */
  public function __construct(TranslationInterface $string_translation) {
    // You can skip injecting this service, the trait will fall back to \Drupal::translation()
    // but it is recommended to do so, for easier testability,
    $this->stringTranslation = $string_translation;
  }

  /**
   * Does something.
   */
  public function doSth() {
    // ...
    $string = $this->t('Something');
    // ...
  }

}

Quelle: https://www.drupal.org/docs/8/api/translation-api-code-text

Verfahrensordnung

Verwenden Sie t().

Wenn Sie über prozeduralen Code verfügen, z. B. einen Hook, verwenden Sie t()eine globale Funktion.

Nicht die beste Vorgehensweise wäre, das Verfahren t()im OOP-Code zu verwenden.

4k4
quelle
Beachten Sie, dass durch das Erweitern einiger Klassentypen, z. B. das Erweitern von ControllerBase beim Erstellen eines Controllers, $ this-> t () bereits bereitgestellt wird, ohne dass StringTranslationTrait verwendet werden muss.
Jaypan
Ja, es gibt viele Basisklassen, die $this->t()sofort verfügbar sind. Es gibt über hundert im Kern. Das Codebeispiel wird nur benötigt, wenn Sie nicht von einer dieser Klassen ausgehen.
4k4
Und was ist mit dem Fall, wenn wir Drush-Befehle entwickeln? Sollten wir StringTranslationTrait verwenden oder eine bestimmte Funktion dt () drush?
17ртем Ильин
Das ist eine großartige Erklärung. Warum brauchen wir das use StringTranslationTrait;im Unterricht?
David
Es ist besser zu verwenden$this->setStringTranslation($string_translation);
MPP
4

Die beste Vorgehensweise ist, $ this-> t () anstelle von t () zu verwenden. Die Verwendung des Moduls wird sich nicht ändern. Mit dem Aufkommen von Drupal 8 haben wir jetzt PHPUnit-Tests in den Kern integriert. Mit PHPUnit-Tests können Tests geschrieben werden, um zu bestätigen, dass alles funktioniert. Bei jeder Änderung des Codes können die Tests ausgeführt werden, um sicherzustellen, dass nichts beschädigt wurde. Die Relevanz davon ist, dass PHPUnit-Tests nur für eine einzelne Klasse (auch bekannt als Einheit) getestet werden, was bedeutet, dass der Kern für diese Tests nicht gebootet wird. Globale Funktionen wie t () sind daher nicht vorhanden und geben einen Fehler aus, wodurch verhindert wird, dass die Tests ausgeführt werden.

Wenn Sie niemals Komponententests erstellen, werden Sie nie den Unterschied zwischen der Verwendung von t () und $ this-> t () feststellen. Das Erstellen von Tests ist jedoch auch eine bewährte Methode. Wenn Sie also wirklich die Dinge richtig machen möchten, Sie sollten $ this-> t () verwenden und Unit-Tests für jede Ihrer Klassen erstellen.

* Bearbeiten *

Aktualisierung nach dem Lesen des Beitrags von 4k4.

Meine obigen Kommentare beziehen sich nur auf OOP-Code, nicht auf Verfahrenscode. Der Prozedurcode ist weder einheitlich getestet noch hat er den Konstruktor $ this. Im Verfahrenscode ist t () korrekt.

Jaypan
quelle
Hervorragende Erklärung! Übrigens, ich freue mich darauf, Ihr Buch zu lesen.
Kein Sssweat