Ich verwende die folgende Zeile in einer Controller-Klasse.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh gibt mir diese Fehlermeldung.
\ Drupal-Aufrufe sollten in Klassen vermieden werden. Verwenden Sie stattdessen die Abhängigkeitsinjektion.
Wie soll ich das erreichen? Muss ich einen Konstruktor, eine Methode oder einen Service erstellen? Wenn ja, welchen Code sollte der Dienst benötigen? Ich fand ein Beispiel zu "Drupal-Aufrufe sollten in Klassen vermieden werden, verwenden Sie stattdessen die Abhängigkeitsinjektion" für einen Fall, in dem ein Dienst bereits vorhanden ist.
8
services
dependency-injection
Kevin Nowaczyk
quelle
quelle
create
wird die übergeordnete Methode überlasten - hier können Sie die Dienste einfügen, die Sie benötigen. Der Konstruktor lässt Sie diese dann Instanzvariablen in der Klasse zuweisen, damit Sie sie verwenden können$this->fooInjectedClass->methodName()
Antworten:
In einem Controller injizieren Sie Services mithilfe des Service-Containers. Zum Beispiel
ModuleHandler
:Dann können Sie
\Drupal
Anrufe vermeiden, indem Sie den injizierten Dienst verwenden:Sie können jeden Dienst, vorhandene Dienste aus Core / Contrib oder Dienste, die Sie im benutzerdefinierten Code definiert haben, in eine
*.services.yml
Datei einfügen .Um einen Kerndienstnamen zu finden, schaue ich normalerweise nach
core.services.yml
, da dies der schnellste Weg ist, wenn Sie in Ihrer IDE an einem Drupal-Projekt arbeiten.Sie können Drupal Console verwenden, um alle Dienste aufzulisten , nicht nur vom Kern:
Sie können auch das Devel-Modul verwenden , mit dem Sie nach einem Namen suchen können:
quelle
ControllerBase
Klasse implementiert dieContainerInjectionInterface
Schnittstelle bereits. Es ist nicht erforderlichimplements ContainerInjectionInterface
, eine Klasse zu erweiternControllerBase
.