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 đ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()
?
Câu trả lời:
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.
$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.
use StringTranslationTrait;
trong lớp học?
$this->setStringTranslation($string_translation);
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.
string_translation
dịch vụ hơn.