Лучшая практика: $ this-> t () против t ()

10

Я ищу лучшую практику: должны ли используемые модули использовать $this->t()или t()?

Вим Мострей
источник
Я предпочитаю использовать StringTranslationTrait: t, потому что проще издеваться над string_translationсервисом.
Мрадклифф

Ответы:

24

Лучшая практика зависит от того, где размещен код.

Код ООП

Использование $this->t().

Если вы расширяете базовый класс drupal, например, контроллер или плагин, функция t () предоставляется как метод класса $this->t()из коробки, и вы должны использовать его. Это делает ваш код тестируемым.

Для большинства задач вы найдете подходящий класс drupal, который можно расширить, из которого он $this->t()определен, но если вам нужно создать свой собственный класс с нуля, лучше всего использовать черту перевода строк и внедрить ее как службу, если вы используете этот класс в контекст службы:

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

}

Источник: https://www.drupal.org/docs/8/api/translation-api-code-text

Процессуальный кодекс

Использование t().

Если у вас есть процедурный код, например хук, используйте t()глобальную функцию.

Не лучшей практикой было бы использование процедурного t()кодекса ООП.

4k4
источник
1
Обратите внимание, что благодаря расширению некоторых типов классов, например расширению ControllerBase при создании контроллера, $ this-> t () уже предоставляется без необходимости использовать StringTranslationTrait.
Джайпан
Да, есть много базовых классов, которые предоставляют « $this->t()из коробки», их более ста. Пример кода необходим только в том случае, если вы не расширяете ни один из этих классов.
4k4
А как насчет случая, когда мы разрабатываем команду drush? Должны ли мы использовать StringTranslationTrait или drush для определенной функции dt ()?
Артем Ильин
это отличное объяснение. Зачем нам это нужно use StringTranslationTrait;в классе?
Дэвид
Это лучше использовать$this->setStringTranslation($string_translation);
MPP
4

Лучше всего использовать $ this-> t (), а не t (). Использование модуля не изменится, однако с появлением Drupal 8 у нас теперь встроено тестирование PHPUnit в ядро. Тестирование PHPUnit позволяет писать тесты для подтверждения того, что все работает, так что в любое время код может быть изменен, чтобы убедиться, что ничего не нарушено. Актуальность этого заключается в том, что тестирование PHPUnit проверяет только один класс (он же модуль), что означает, что ядро ​​не загружается для этих тестов. Таким образом, глобальные функции, такие как t (), не существуют, и они будут выдавать ошибку, препятствующую запуску тестов.

Если вы никогда не будете создавать какие-либо модульные тесты, то вы никогда не увидите разницу между использованием t () и $ this-> t (), однако создание тестов также является наилучшей практикой, и поэтому, если вы действительно хотите делать все правильно, Вы должны использовать $ this-> t () и создавать модульные тесты для каждого из ваших классов.

* Редактировать *

Обновление после прочтения поста 4k4.

Мои комментарии выше касаются только кода ООП, а не процедурного кода. Процедурный код не тестируется модулем и не имеет конструктора $ this. В процедурном коде t () является правильным.

Jaypan
источник
Отличное объяснение! Кстати, с нетерпением жду чтения вашей книги.
Нет Sssweat