У контролері ви надаєте послуги, використовуючи службовий контейнер. Наприклад 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')
);
}
Тоді ви можете уникнути \Drupal
дзвінків, скориставшись службою введення:
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
Ви можете вводити будь-яку службу, існуючу з ядра / contrib або служб, визначених у власному коді у *.services.yml
файлі.
Щоб знайти ім'я основної служби, яке я зазвичай шукаю core.services.yml
, тому що це найшвидший спосіб, коли ви працюєте над проектом drupal у своїй IDE.
Ви можете використовувати консоль Drupal, щоб перелічити всі сервіси, а не лише основні:
drupal debug:container
Ви також можете використовувати модуль Devel , який дозволяє шукати ім’я:
/devel/container/service
create
перевантажить батьківський метод - тут ви можете ввести потрібні вам послуги. Конструктор дозволить вам призначити їх для змінних екземплярів у класі, тому ви можете використовувати$this->fooInjectedClass->methodName()