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 \Drupal
cá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.yml
tệ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
create
sẽ 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()