Praktik terbaik: $ this-> t () versus t ()

10

Saya mencari praktik terbaik: haruskah kontribusi modul digunakan $this->t()atau t()?

Wim Mostrey
sumber
Saya lebih suka menggunakan StringTranslationTrait: t karena lebih mudah untuk mengejek string_translationlayanan.
mradcliffe

Jawaban:

24

Praktik terbaik tergantung pada di mana kode ditempatkan.

Kode OOP

Gunakan $this->t().

Jika Anda memperpanjang kelas dasar drupal seperti controller atau plugin, fungsi t () disediakan sebagai metode kelas di $this->t()luar kotak dan Anda harus menggunakannya. Ini membuat kode Anda dapat diuji.

Untuk sebagian besar tugas, Anda akan menemukan kelas drupal yang sesuai untuk diperluas dari yang telah $this->t()ditentukan, tetapi jika Anda perlu membangun kelas Anda sendiri dari awal, praktik terbaik adalah dengan menggunakan sifat terjemahan string dan menyuntikkan ini sebagai layanan jika Anda menggunakan kelas ini di konteks layanan:

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

}

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

Kode Prosedural

Gunakan t().

Jika Anda memiliki kode prosedural, misalnya sebuah hook, gunakan t(), yang merupakan fungsi global.

Bukan praktik terbaik adalah menggunakan prosedural t()dalam Kode OOP.

4k4
sumber
1
Perhatikan bahwa dengan memperluas beberapa jenis kelas, misalnya memperluas ControllerBase saat membuat controller, $ this-> t () sudah disediakan tanpa perlu menggunakan StringTranslationTrait.
Jaypan
Ya, ada banyak kelas dasar yang menyediakan di $this->t()luar kotak, ada lebih dari seratus inti. Contoh kode hanya diperlukan, jika Anda tidak memperpanjang dari salah satu kelas ini.
4k4
Dan bagaimana dengan kasus ketika kita mengembangkan perintah drush? Haruskah kita menggunakan StringTranslationTrait atau drush function spesifik dt ()?
Артем Ильин
itu penjelasan yang bagus. Mengapa kita membutuhkan ini di use StringTranslationTrait;dalam kelas?
David
Lebih baik digunakan$this->setStringTranslation($string_translation);
mpp
4

Praktik terbaik adalah menggunakan $ this-> t (), daripada t (). Penggunaan modul tidak akan berubah, namun, dengan munculnya Drupal 8, kami sekarang memiliki pengujian PHPUnit yang dibangun menjadi inti. Pengujian PHPUnit memungkinkan untuk tes ditulis untuk mengkonfirmasi semuanya berfungsi, sehingga kode kapan saja diubah, tes dapat dijalankan untuk memastikan tidak ada yang rusak. Relevansi ini adalah bahwa pengujian pengujian PHPUnit hanya terhadap satu kelas (alias satu unit), yang berarti inti tidak di-bootstrap untuk tes-tes ini. Fungsi global seperti t () karena itu tidak ada, dan mereka akan melempar kesalahan, mencegah tes dari dijalankan.

Jika Anda tidak pernah membuat tes unit apa pun, maka Anda tidak akan pernah melihat perbedaan antara menggunakan t () dan $ this-> t (), namun membuat tes juga merupakan praktik terbaik, dan oleh karena itu jika Anda benar-benar ingin melakukan sesuatu dengan benar, Anda harus menggunakan $ this-> t (), dan membuat tes Unit untuk masing-masing kelas Anda.

* Edit *

Memperbarui setelah membaca posting 4k4.

Komentar saya di atas hanya terkait dengan kode OOP, bukan kode prosedural. Kode prosedural bukan unit yang diuji, juga tidak memiliki $ this constructor. Dalam kode prosedural, t () benar.

Jaypan
sumber
Penjelasan yang bagus! BTW, menantikan untuk membaca buku Anda.
No Sssweat