Thực hành tốt nhất: $ this-> t () so với t ()


10

Tôi đang tìm kiếm một thực tiễn tốt nhất: các mô-đun đóng góp nên sử dụng $this->t()hay t()?


Tôi thích sử dụng StringTranslationTrait: t vì dễ giả định string_translationdịch vụ hơn.
mradcliffe

Câu trả lời:


23

Thực hành tốt nhất phụ thuộc vào nơi mã được đặt.

Mã OOP

Sử dụng $this->t().

Nếu bạn mở rộng một lớp cơ sở drupal như bộ điều khiển hoặc plugin, hàm t () được cung cấp dưới dạng phương thức lớp $this->t()ngoài hộp và bạn nên sử dụng nó. Điều này làm cho mã của bạn có thể kiểm tra được.

Đối với hầu hết các tác vụ, bạn sẽ tìm thấy một lớp drupal phù hợp để mở rộng từ đó đã $this->t()xác định, nhưng nếu bạn cần xây dựng lớp của riêng mình từ đầu, thực tế tốt nhất là sử dụng đặc điểm dịch chuỗi và tiêm nó làm dịch vụ nếu bạn sử dụng lớp này trong bối cảnh dịch vụ:

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

}

Nguồn: https://www.drupal.org/docs/8/api/translation-api-code-text

Mã thủ tục

Sử dụng t().

Nếu bạn có mã thủ tục, ví dụ như hook, thì sử dụng t(), đó là một hàm toàn cục.

Không thực hành tốt nhất sẽ là sử dụng thủ tục t()trong Mã OOP.


Lưu ý rằng bằng cách mở rộng một số loại lớp, ví dụ như mở rộng ControllerBase khi tạo bộ điều khiển, $ this-> t () đã được cung cấp mà không cần sử dụng StringTranslationTrait.
Jaypan

Vâng, có rất nhiều lớp cơ sở cung cấp $this->t()ngoài hộp, có hơn trăm lõi. Ví dụ mã chỉ cần thiết, nếu bạn không mở rộng từ một trong các lớp này.
4k4

Và những gì về trường hợp khi chúng tôi phát triển lệnh drush? Chúng ta có nên sử dụng StringTranslationTrait hoặc drush hàm cụ thể dt () không?
Đăng nhập

đó là một lời giải thích tuyệt vời Tại sao chúng ta cần điều này use StringTranslationTrait;trong lớp học?
David

Sử dụng tốt hơn$this->setStringTranslation($string_translation);
mpp

4

Cách thực hành tốt nhất là sử dụng $ this-> t (), thay vì t (). Việc sử dụng mô-đun sẽ không thay đổi, tuy nhiên, với sự ra đời của Drupal 8, giờ đây chúng tôi đã có thử nghiệm PHPUnit được tích hợp vào lõi. Kiểm tra PHPUnit cho phép các bài kiểm tra được viết để xác nhận mọi thứ hoạt động, do đó, bất cứ khi nào mã được thay đổi, các bài kiểm tra có thể được chạy để đảm bảo không có gì bị hỏng. Sự liên quan của điều này là các bài kiểm tra PHPUnit chỉ kiểm tra một lớp duy nhất (còn gọi là một đơn vị), có nghĩa là lõi không được bootstraged cho các bài kiểm tra này. Do đó, các hàm toàn cầu như t () không tồn tại và chúng sẽ gây ra lỗi, ngăn các bài kiểm tra được chạy.

Nếu bạn không bao giờ tạo bất kỳ bài kiểm tra đơn vị nào, thì bạn sẽ không bao giờ thấy sự khác biệt giữa việc sử dụng t () và $ this-> t (), tuy nhiên, việc tạo các bài kiểm tra cũng là một cách tốt nhất, và do đó nếu bạn thực sự muốn làm đúng, bạn nên sử dụng $ this-> t () và tạo các bài kiểm tra Đơn vị cho mỗi lớp của bạn.

* Biên tập *

Cập nhật sau khi đọc bài viết của 4k4.

Nhận xét của tôi ở trên chỉ liên quan đến mã OOP, không phải mã thủ tục. Mã thủ tục không phải là đơn vị được kiểm tra, nó cũng không có $ constructor này. Trong mã thủ tục, t () là chính xác.


Giải thích tuyệt vời! BTW, mong được đọc cuốn sách của bạn.
Không có Sssweat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.