Estoy usando la siguiente línea en una clase de controlador.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh me está dando este mensaje de error.
\ Las llamadas de Drupal deben evitarse en las clases, utilice la inyección de dependencia en su lugar.
¿Cómo debo lograr esto? ¿Necesito crear un constructor, crear un método o un servicio? Si es así, ¿qué código debe necesitar el servicio? Encontré un ejemplo sobre "Las llamadas de Drupal deben evitarse en las clases, use la inyección de dependencia en su lugar" para un caso donde ya existe un servicio.
8
services
dependency-injection
Kevin Nowaczyk
fuente
fuente
create
sobrecargará el método principal; aquí puede inyectar los servicios que necesita. El constructor le permitirá asignarlos a las variables de instancia en la clase, para que pueda usar$this->fooInjectedClass->methodName()
Respuestas:
En un controlador, inyecta servicios utilizando el contenedor de servicios. Por ejemplo
ModuleHandler
:Entonces puedes evitar
\Drupal
llamadas utilizando el servicio inyectado:Puede inyectar cualquier servicio, los existentes desde el núcleo / contrib o los servicios que ha definido en un código personalizado en un
*.services.yml
archivo.Para encontrar un nombre de servicio principal, generalmente busco
core.services.yml
, porque esa es la forma más rápida cuando está trabajando en un proyecto drupal en su IDE.Puede usar la Consola Drupal para enumerar todos los servicios, no solo desde el núcleo:
También puede usar el módulo Devel , que le permite buscar un nombre:
fuente
ControllerBase
clase ya implementa laContainerInjectionInterface
interfaz. No es necesario agregarimplements ContainerInjectionInterface
a una clase que se extiendeControllerBase
.