Estou usando a seguinte linha em uma classe de controlador.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh está me dando essa mensagem de erro.
\ Chamadas de Drupal devem ser evitadas nas classes, use a injeção de dependência.
Como devo fazer isso? Preciso criar um construtor, criar um método ou um serviço? Em caso afirmativo, qual código o serviço precisa? Eu encontrei um exemplo em "Chamadas Drupal devem ser evitadas nas classes, use a injeção de dependência" para um caso em que já exista um serviço.
8
services
dependency-injection
Kevin Nowaczyk
fonte
fonte
create
sobrecarregará o método pai - aqui você pode injetar os serviços necessários. O construtor, então, permitem atribuir os a variáveis de instância na classe, assim você pode usar$this->fooInjectedClass->methodName()
Respostas:
Em um controlador, você injeta serviços usando o contêiner de serviço. Por exemplo
ModuleHandler
:Em seguida, você pode evitar
\Drupal
chamadas usando o serviço injetado:Você pode injetar qualquer serviço, existente do núcleo / contrib ou serviços que você definiu no código personalizado em um
*.services.yml
arquivo.Para encontrar um nome de serviço principal, costumo procurar
core.services.yml
, porque essa é a maneira mais rápida quando você está trabalhando em um projeto drupal no seu IDE.Você pode usar o Drupal Console para listar todos os serviços, não apenas do núcleo:
Você também pode usar o módulo Devel , que permite procurar um nome:
fonte
ControllerBase
classe já implementa aContainerInjectionInterface
interface. Não há necessidade de adicionarimplements ContainerInjectionInterface
a uma classe que se estendeControllerBase
.