Apa perbedaan antara menggunakan $ this-> t ('text') dan t ('text') dalam plugin blok

7

Saya perhatikan dalam banyak tutorial untuk membangun plugin blok,

$this->t('text')

digunakan untuk membuat teks yang dapat diterjemahkan, terutama dalam fungsi bentuk blok. Namun menggunakan

t('text') 

tidak menghasilkan kesalahan. Apakah ada perbedaan antara menggunakan salah satu dari ini? Dan jika tidak ada, praktik terbaik apa?

Mat
sumber

Jawaban:

6

Untuk lebih tepatnya pada pertanyaan Anda: tidak ada perbedaan dalam implementasi internal.

Tetapi sebagai praktik terbaik , Anda harus menggunakan $this->talih-alih global tsedapat mungkin. Jika Anda memeriksa fungsinya, tmengembalikan objek TranslateableMarkup baru .

Jika kelas Anda mengatakan $this->ttidak didefinisikan, Anda bisa menambahkan StringTranslationTrait untuk menambahkan perilaku atau menyuntikkannya sebagai dependensi.

Menggunakan sifat ini akan menambahkan metode t () dan formatPlural () ke kelas. Ini harus digunakan untuk setiap string yang dapat diterjemahkan, mirip dengan bagaimana kode prosedural harus menggunakan fungsi global t () dan \ Drupal :: translation () -> formatPlural (). Ini memungkinkan alat ekstraktor string untuk menemukan string yang dapat diterjemahkan.

Jika kelas mampu menyuntikkan layanan dari wadah, itu harus menyuntikkan layanan 'string_translation' dan menetapkannya ke $ this-> stringTranslation.

Jadi sebagai aturan praktik terbaik, Anda umumnya tidak ingin mencampur prosedural dalam OOP kecuali benar-benar tidak dapat dihindari (misalnya fungsi PHP asli).

Kevin
sumber
4

Dokumentasi untuk t () menyatakan:

Bila memungkinkan, gunakan \Drupal\Core\StringTranslation\StringTranslationTrait::t(). Kalau tidak, buat \Drupal\Core\StringTranslation\TranslatableMarkupobjek baru secara langsung.

Itu tidak menjelaskan alasan untuk ini, tetapi jika Anda melihat komentar pada halaman dokumentasi , itu akan memberi Anda alasan untuk menggunakan metode sifat itu, atau kelas itu.

Kelas dapat diuji secara individual dengan PHPUnit, yang berjalan tanpa inti bootstrap, tetapi t()fungsinya hanya tersedia ketika inti bootstrap.
Menggunakan $this->t()dan StringTranslationTraitmemungkinkan terjemahan untuk diejek, sehingga kelas dapat diuji secara terpisah dengan PHPUnit.

kiamlaluno
sumber