Я ищу лучшую практику: должны ли используемые модули использовать $this->t()
или t()
?
Я ищу лучшую практику: должны ли используемые модули использовать $this->t()
или t()
?
Ответы:
Лучшая практика зависит от того, где размещен код.
Код ООП
Использование $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()
кодекса ООП.
$this->t()
из коробки», их более ста. Пример кода необходим только в том случае, если вы не расширяете ни один из этих классов.
use StringTranslationTrait;
в классе?
$this->setStringTranslation($string_translation);
Лучше всего использовать $ this-> t (), а не t (). Использование модуля не изменится, однако с появлением Drupal 8 у нас теперь встроено тестирование PHPUnit в ядро. Тестирование PHPUnit позволяет писать тесты для подтверждения того, что все работает, так что в любое время код может быть изменен, чтобы убедиться, что ничего не нарушено. Актуальность этого заключается в том, что тестирование PHPUnit проверяет только один класс (он же модуль), что означает, что ядро не загружается для этих тестов. Таким образом, глобальные функции, такие как t (), не существуют, и они будут выдавать ошибку, препятствующую запуску тестов.
Если вы никогда не будете создавать какие-либо модульные тесты, то вы никогда не увидите разницу между использованием t () и $ this-> t (), однако создание тестов также является наилучшей практикой, и поэтому, если вы действительно хотите делать все правильно, Вы должны использовать $ this-> t () и создавать модульные тесты для каждого из ваших классов.
* Редактировать *
Обновление после прочтения поста 4k4.
Мои комментарии выше касаются только кода ООП, а не процедурного кода. Процедурный код не тестируется модулем и не имеет конструктора $ this. В процедурном коде t () является правильным.
string_translation
сервисом.