Я использую следующую строку в классе контроллера.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh дает мне это сообщение об ошибке.
В классах следует избегать вызовов Drupal, вместо этого используйте внедрение зависимостей.
Как мне это сделать? Нужно ли создавать конструктор, метод или сервис? Если да, то какой код нужен сервису? Я нашел пример: «В классах следует избегать вызовов Drupal, вместо этого используйте внедрение зависимостей» для случая, когда сервис уже существует.
8
services
dependency-injection
Кевин Новачик
источник
источник
create
перегрузит родительский метод - здесь вы можете ввести нужные вам сервисы. Затем конструктор позволит вам назначить их переменным экземпляра в классе, чтобы вы могли их использовать$this->fooInjectedClass->methodName()
Ответы:
В контроллере вы вводите сервисы, используя сервисный контейнер. Например
ModuleHandler
:Тогда вы можете избежать
\Drupal
звонков, используя услугу:Вы можете внедрить в
*.services.yml
файл любую службу, существующую из core / contrib или службы, которые вы определили в пользовательском коде .Чтобы найти имя основного сервиса, я обычно смотрю
core.services.yml
, потому что это самый быстрый способ, когда вы работаете над проектом drupal в вашей IDE.Вы можете использовать консоль Drupal для вывода списка всех сервисов, а не только из ядра:
Вы также можете использовать модуль Devel , который позволяет искать имя:
источник
ControllerBase
Класс уже реализуетContainerInjectionInterface
интерфейс. Нет необходимости добавлятьimplements ContainerInjectionInterface
в класс, который расширяетсяControllerBase
.