it-swarm.com.de

Wie verwende ich die Abhängigkeitsinjektion von \ Drupal :: moduleHandler () zu einem Controller?

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 für "Drupal-Aufrufe sollten in Klassen vermieden werden, verwenden Sie stattdessen die Abhängigkeitsinjektion" für einen Fall, in dem bereits ein Dienst vorhanden ist.

15
Kevin Nowaczyk

In einem Controller injizieren Sie Dienste mithilfe des Dienstcontainers. Zum Beispiel 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')
    );  
  }

Dann können Sie \Drupal Aufrufe vermeiden, indem Sie den injizierten Dienst verwenden:

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

Sie können jeden Dienst, vorhandene aus Core/Contrib oder Dienste, die Sie in benutzerdefiniertem 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 an einem drupal - Projekt in Ihrer IDE arbeiten.

Mit Drupal Console können Sie alle Dienste auflisten, nicht nur vom Kern aus:

drupal debug:container

Sie können auch das Entwicklungsmodul verwenden, mit dem Sie nach einem Namen suchen können:

/devel/container/service
21
4k4