web-dev-qa-db-fra.com

Meilleure pratique: $ this-> t () versus t()

Je recherche une meilleure pratique: les modules contribués doivent-ils utiliser $this->t() ou t()?

10
Wim Mostrey

Les meilleures pratiques dépendent de l'emplacement du code.

Code OOP

Utilisez $this->t().

Si vous étendez une classe de base drupal comme un contrôleur ou un plugin, la fonction t() est fournie comme méthode de classe $this->t() à partir de la et vous devriez l'utiliser. Cela rend votre code testable.

Pour la plupart des tâches, vous trouverez une classe drupal à étendre à partir de laquelle $this->t() a été définie, mais si vous avez besoin de créer votre propre classe à partir de zéro, la meilleure pratique serait d'utiliser le trait de traduction de chaîne et l'injecter en tant que service si vous utilisez cette classe dans un contexte de service:

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');
    // ...
  }

}

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

Code de procédure

Utilisez t().

Si vous avez du code procédural, par exemple un hook, utilisez alors t(), qui est une fonction globale.

La meilleure pratique serait d'utiliser la procédure t() dans OOP Code.

23
4k4

La meilleure pratique consiste à utiliser $ this-> t (), plutôt que t (). L'utilisation du module ne changera pas, cependant, avec l'avènement de Drupal 8, nous avons maintenant des tests PHPUnit intégrés dans le noyau. Les tests PHPUnit permettent d'écrire des tests pour confirmer que tout fonctionne, de sorte que chaque fois que le code est modifié, les tests peuvent être exécutés pour s'assurer que rien n'a été cassé. La pertinence de cela est que PHPUnit teste uniquement avec une seule classe (alias une unité), ce qui signifie que le noyau n'est pas amorcé pour ces tests. as t() donc n'existent pas, et ils jetteront une erreur, empêchant l'exécution des tests.

Si vous ne créez jamais de tests unitaires, vous ne verrez jamais la différence entre l'utilisation de t() et $ this-> t (), mais la création de tests est également une meilleure pratique, et donc si vous voulez vraiment bien faire les choses, vous devez utiliser $ this-> t () et créer des tests unitaires pour chacune de vos classes.

* Modifier *

Mise à jour après avoir lu le post de 4k4.

Mes commentaires ci-dessus ne concernent que OOP code, pas de code procédural. Le code procédural n'est pas testé unitaire, ni le constructeur $ this. Dans le code procédural, t() est correct.

4
Jaypan