最佳实践:$ this-> t()与t()


10

我正在寻找最佳实践:应使用贡献模块$this->t()还是t()


我更喜欢使用StringTranslationTrait:t,因为它更容易模拟string_translation服务。
mradcliffe

Answers:


24

最佳实践取决于代码的放置位置。

OOP代码

使用$this->t()

如果您扩展了诸如控制器或插件之类的drupal基类$this->t(),则开箱即用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()OOP代码中的程序。


1
请注意,通过扩展某些类型的类,例如在创建控制器时扩展ControllerBase,已经提供了$ this-> t(),而无需使用StringTranslationTrait。
Jaypan'1

是的,提供$this->t()了许多开箱即用的基类,有超过一百个核心类。仅当您不从这些类之一扩展时,才需要代码示例。
4k4,14

那么当我们开发drush命令时会怎样呢?我们应该使用StringTranslationTrait还是使用特定的函数dt()?
АртемИльин

这是一个很好的解释。为什么我们use StringTranslationTrait;在课堂上需要这个?
戴维

最好使用$this->setStringTranslation($string_translation);
mpp

4

最佳实践是使用$ this-> t(),而不是t()。模块的用法不会改变,但是,随着Drupal 8的出现,我们现在已经将PHPUnit测试内置到核心中。PHPUnit测试允许编写测试以确认一切正常,因此,只要更改代码,就可以运行测试以确保没有损坏。与此相关的是,PHPUnit测试仅针对单个类(也称为单元)进行测试,这意味着这些测试不会引导内核。因此,不存在诸如t()之类的全局函数,它们会引发错误,从而阻止运行测试。

如果您从不创建任何单元测试,那么您将永远不会看到使用t()和$ this-> t()之间的区别,但是创建测试也是一种最佳做法,因此,如果您确实想做正确的事情,您应该使用$ this-> t(),并为每个类创建单元测试。

*编辑*

阅读4k4的帖子后进行更新。

我在上面的评论仅涉及OOP代码,而不涉及过程代码。程序代码未经单元测试,也没有$ this构造函数。在过程代码中,t()是正确的。


极好的解释!顺便说一句,期待阅读您的书。
No Sssweat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.