Làm cách nào để sử dụng phép nội xạ phụ thuộc vào \ Drupal :: moduleHandler () cho Bộ điều khiển?


14

Tôi đang sử dụng dòng sau trong một lớp điều khiển.

    \Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);

Pareview.sh đang đưa cho tôi thông báo lỗi này.

\ Nên tránh các cuộc gọi Drupal trong các lớp học, sử dụng tiêm phụ thuộc thay thế.

Làm thế nào tôi nên thực hiện điều này? Tôi có cần tạo một hàm tạo, tạo một phương thức hoặc một dịch vụ không? Nếu vậy, dịch vụ cần mã nào? Tôi đã tìm thấy một ví dụ về "Nên tránh các cuộc gọi Drupal trong các lớp học, sử dụng tiêm phụ thuộc thay thế" cho trường hợp dịch vụ đã tồn tại.


createsẽ quá tải phương thức cha mẹ - ở đây bạn có thể tiêm các dịch vụ bạn cần. Sau đó, hàm tạo sẽ cho phép bạn gán các biến đó cho các biến thể hiện trong lớp, do đó bạn có thể sử dụng$this->fooInjectedClass->methodName()
Kevin

Chúng ta đã có một câu hỏi về điều này? Nếu không, chúng ta thực sự nên làm điều này là kinh điển.
mpdon Arena

Câu trả lời:


20

Trong bộ điều khiển, bạn tiêm dịch vụ bằng cách sử dụng bộ chứa dịch vụ. Ví dụ ModuleHandler:

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;

class MyController extends ControllerBase {

  /**
   * The module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * Constructs a MyController object
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler service.
   */
  public function __construct(ModuleHandlerInterface $module_handler) {
    $this->moduleHandler = $module_handler;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler')
    );  
  }

Sau đó, bạn có thể tránh \Drupalcác cuộc gọi bằng cách sử dụng dịch vụ được tiêm:

$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);

Bạn có thể tiêm bất kỳ dịch vụ nào, các dịch vụ hiện có từ lõi / đóng góp hoặc các dịch vụ bạn đã xác định trong mã tùy chỉnh trong một *.services.ymltệp.

Để tìm một tên dịch vụ cốt lõi mà tôi thường tìm hiểu core.services.yml, bởi vì đó là cách nhanh nhất khi bạn đang làm việc với một dự án drupal trong IDE của bạn.

Bạn có thể sử dụng Bảng điều khiển Drupal để liệt kê tất cả các dịch vụ, không chỉ từ cốt lõi:

drupal debug:container

Bạn cũng có thể sử dụng mô-đun Devel , cho phép bạn tìm kiếm tên:

/devel/container/service

1
Loại câu hỏi / câu trả lời này nên được mở rộng khi tôi đồng ý và đóng góp lại cho các tài liệu của drupal.org. Có một số ở đó, nhưng tôi cảm thấy các ví dụ thực tế như thế này luôn luôn giúp đỡ.
Kevin

4
Các ControllerBaselớp học đã thực hiện các ContainerInjectionInterfacegiao diện. Không cần phải thêm implements ContainerInjectionInterfacevào một lớp mở rộng ControllerBase.
kiamlaluno

Phải, chỉ cần chú ý điều tương tự như @kiamlaluno; sẽ là lớn để cập nhật câu trả lời!
Stefanos Petrakis
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.