Korzystam z następującego wiersza w klasie kontrolera.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh wyświetla mi ten komunikat o błędzie.
\ Wywołania Drupala należy unikać w klasach, zamiast tego należy stosować wstrzykiwanie zależności.
Jak mam to osiągnąć? Czy muszę utworzyć konstruktor, metodę lub usługę? Jeśli tak, jakiego kodu powinna potrzebować usługa? Znalazłem przykład dotyczący „wywołań Drupala w klasach, zamiast tego używaj wstrzykiwania zależności” w przypadku, gdy usługa już istnieje.
8
services
dependency-injection
Kevin Nowaczyk
źródło
źródło
create
przeciążą metodę nadrzędną - tutaj możesz wstrzyknąć potrzebne usługi. Konstruktor pozwoli ci następnie przypisać je do zmiennych instancji w klasie, abyś mógł użyć$this->fooInjectedClass->methodName()
Odpowiedzi:
W kontrolerze wstrzykujesz usługi za pomocą kontenera usług. Na przykład
ModuleHandler
:Następnie możesz uniknąć
\Drupal
połączeń za pomocą wstrzykniętej usługi:Możesz wstrzyknąć dowolną usługę, istniejącą z core / contrib lub usługi zdefiniowane w niestandardowym kodzie w
*.services.yml
pliku.Aby znaleźć podstawową nazwę usługi, zwykle szukam
core.services.yml
, ponieważ jest to najszybszy sposób, gdy pracujesz nad projektem drupal w twoim IDE.Możesz użyć Drupal Console, aby wyświetlić listę wszystkich usług, nie tylko podstawowych:
Możesz także użyć modułu Devel , który pozwala wyszukać nazwę:
źródło
ControllerBase
Klasa już implementujeContainerInjectionInterface
interfejs. Nie ma potrzeby dodawaniaimplements ContainerInjectionInterface
do rozszerzonej klasyControllerBase
.