web-dev-qa-db-fra.com

Comment utiliser l'injection de dépendances sur \ Drupal :: moduleHandler () à un contrôleur?

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épendances" pour un cas où un service existe déjà.

15
Kevin Nowaczyk

Dans un contrôleur, vous injectez des services à l'aide du conteneur de services. Par exemple ModuleHandler:

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;

class MyController extends ControllerBase {

  /**
   * The module handler service.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * Constructs a MyController object
   *
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   The module handler service.
   */
  public function __construct(ModuleHandlerInterface $module_handler) {
    $this->moduleHandler = $module_handler;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('module_handler')
    );  
  }

Vous pouvez alors éviter \Drupal appels en utilisant le service injecté:

$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);

Vous pouvez injecter n'importe quel service, existant depuis le noyau/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 noyau:

drupal debug:container

Vous pouvez également utiliser le module Devel , qui vous permet de rechercher un nom:

/devel/container/service
21
4k4