В контроллере вы вводите сервисы, используя сервисный контейнер. Например 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);
Вы можете внедрить в *.services.yml
файл любую службу, существующую из core / contrib или службы, которые вы определили в пользовательском коде .
Чтобы найти имя основного сервиса, я обычно смотрю core.services.yml
, потому что это самый быстрый способ, когда вы работаете над проектом drupal в вашей IDE.
Вы можете использовать консоль Drupal для вывода списка всех сервисов, а не только из ядра:
drupal debug:container
Вы также можете использовать модуль Devel , который позволяет искать имя:
/devel/container/service
create
перегрузит родительский метод - здесь вы можете ввести нужные вам сервисы. Затем конструктор позволит вам назначить их переменным экземпляра в классе, чтобы вы могли их использовать$this->fooInjectedClass->methodName()