J'utilise la ligne suivante dans une classe de contrôleur.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh me donne ce message d'erreur.
\ Les appels Drupal doivent être évités dans les classes, utilisez plutôt l'injection de dépendances.
Comment dois-je accomplir cela? Dois-je créer un constructeur, créer une méthode ou un service? Si oui, de quel code le service devrait-il avoir besoin? J'ai trouvé un exemple sur "Les appels Drupal devraient être évités dans les classes, utilisez plutôt l'injection de dépendance" pour un cas où un service existe déjà.
8
services
dependency-injection
Kevin Nowaczyk
la source
la source
create
surchargera la méthode parent - ici vous pouvez injecter les services dont vous avez besoin. Le constructeur vous laissera ensuite les affecter aux variables d'instance dans la classe, afin que vous puissiez utiliser$this->fooInjectedClass->methodName()
Réponses:
Dans un contrôleur, vous injectez des services à l'aide du conteneur de services. Par exemple
ModuleHandler
:Ensuite, vous pouvez éviter les
\Drupal
appels en utilisant le service injecté:Vous pouvez injecter n'importe quel service, ceux existants de core / contrib ou les services que vous avez définis dans du code personnalisé dans un
*.services.yml
fichier.Pour trouver un nom de service principal, je regarde généralement
core.services.yml
, car c'est le moyen le plus rapide lorsque vous travaillez sur un projet Drupal dans votre IDE.Vous pouvez utiliser Drupal Console pour répertorier tous les services, pas seulement à partir du cœur:
Vous pouvez également utiliser le module Devel , qui vous permet de rechercher un nom:
la source
ControllerBase
classe implémente déjà l'ContainerInjectionInterface
interface. Il n'est pas nécessaire d'ajouterimplements ContainerInjectionInterface
à une classe qui s'étendControllerBase
.