Điểm:1

Làm cách nào tôi có thể tiêm các phụ thuộc dựa trên các điều kiện?

lá cờ cn

Tôi đang tạo một biểu mẫu tùy chỉnh và trong biểu mẫu này, tôi cần sử dụng một dịch vụ có trong một mô-đun khác. Tôi cần sử dụng phép nội xạ phụ thuộc đó dựa trên điều kiện có trong cấu hình.

Điều kiện trong Mẫu cấu hình:

  1. Sử dụng biểu mẫu Custom1
  2. Sử dụng biểu mẫu Custom2

Nếu bật âUse Custom1 Formâ, thì tôi cần sử dụng phép nội xạ phụ thuộc.

không gian tên Drupal\test\Form;

sử dụng Drupal\Core\Form\ConfigFormBase;
sử dụng Drupal\Core\Form\FormStateInterface;
sử dụng Symphony\Component\DependencyInjection\ContainerInterface;
sử dụng Drupal\custom_form1\Services\TestService;

/**
 * Các hình thức kiểm tra.
 */
lớp TestForm mở rộng ConfigFormBase {

  /**
   * Đối tượng đăng ký mã pin.
   *
   * @var Drupal\custom_form1\Services\TestService;
   */
  $TestService được bảo vệ;

  /**
   * Xây dựng một dạng nhiều bước mã pin mới.
   *
   * @param Drupal\custom_form1\Services\TestService $test_service
   * Người xử lý dịch vụ.
   */
  hàm công khai __construct(TestService $test_service) {
    $this->TestService = $test_service;
  }

  /**
   * {@inheritdoc}
   */
  tạo hàm tĩnh công khai (ContainerInterface $container) {
    trả về tĩnh mới (
      $container->get('custom_form1.form1_services')
    );
  }
}

Làm thế nào tôi có thể thêm sử dụng Drupal\custom_form1\Services\TestService; dựa vào điều kiện?

Nếu custom_form1 mô-đun chưa được cài đặt, tôi gặp lỗi. Bất kỳ ý tưởng nào về cách chúng tôi cần tránh lỗi và thêm phụ thuộc dựa trên các điều kiện?

Điểm:3
lá cờ de

Các phần phụ thuộc không thể được thêm vào một cách có điều kiện dựa trên chức năng trong lớp, vì quá trình tiêm xảy ra trong quá trình khởi tạo lớp và đã hoàn tất trước khi các phương thức lớp có thể được gọi. Thay vào đó, bạn tiêm cả hai dịch vụ và sử dụng bất kỳ dịch vụ nào bạn cần khi bạn cần.Hoặc bạn có thể gọi dịch vụ bạn cần một cách tĩnh bằng cách sử dụng \Drupal::dịch vụ() khi bạn thực sự cần nó, mặc dù tốt hơn là sử dụng phép nội xạ phụ thuộc khi ở trong ngữ cảnh lớp hơn là gọi dịch vụ tĩnh.

sonfd avatar
lá cờ in
Chính xác. Và trong trường hợp bạn cần sử dụng dịch vụ từ một mô-đun không phải là phụ thuộc cứng vào mô-đun của bạn, tức là mô-đun có thể chưa được cài đặt, thì việc không sử dụng phép nội xạ phụ thuộc là hoàn toàn có thể chấp nhận được.
Điểm:1
lá cờ us

Câu hỏi không làm cho nó rõ ràng, nhưng vì câu hỏi đề cập đến việc gặp lỗi khi một mô-đun khác không được cài đặt, nên tôi coi đó là điều kiệnkhi mô-đun được cài đặt. Trong trường hợp đó, mô-đun có thể chỉ cần sử dụng đoạn mã sau.

hàm công khai __construct(TestService $test_service = NULL) {
  $this->testService = $test_service;
}

tạo hàm tĩnh công khai (ContainerInterface $container) {
  trả về tĩnh mới (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services') : NULL
  );
}

Trong trường hợp này, lớp trong mô-đun của bạn phải sẵn sàng để không nhận bất kỳ phiên bản lớp nào. Ngoài ra, mô-đun của bạn có thể triển khai một phiên bản đơn giản hóa của dịch vụ, phiên bản này triển khai cùng một giao diện và sử dụng mã tương tự như mã sau.

hàm công khai __construct(TestServiceInterface $test_service = NULL) {
  $this->testService = $test_service;
}

tạo hàm tĩnh công khai (ContainerInterface $container) {
  trả về tĩnh mới (
    $container->has('custom_form1.form1_services') ? $container->get('custom_form1.form1_services') : $container->get('mymodule.form1_services')
  );
}

Điều này giả địnhDịch vụ kiểm tra thực hiện một giao diện có thể được thực hiện từ dịch vụ đơn giản hóa. (Nó cũng giả định rằng có thể triển khai một dịch vụ đơn giản hóa.)

RaMeSh avatar
lá cờ cn
Trong trường hợp này, chúng ta không cần thêm "use Drupal\custom_form1\Services\TestService;" trong tập tin của chúng tôi?
apaderno avatar
lá cờ us
Tốt hơn là sử dụng nó cho giao diện, nếu có. Vâng, bạn cần nó. PHP không kiểm tra sự tồn tại của lớp khi `use Drupal\custom_form1\Services\TestService;` được sử dụng, nhưng khi thể hiện của lớp được sử dụng.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.