Лучшая практика: $ 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()кодекса ООП.


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 () является правильным.


Отличное объяснение! Кстати, с нетерпением жду чтения вашей книги.
— Нет Sssweat
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.