it-swarm.com.de

Wie verwende ich helper / private Methoden mit einer .module-Datei?

Angenommen, ich verwende einen Hook mit viel Code. Um die Lesbarkeit und Wiederverwendbarkeit zu verbessern, möchte ich Hilfs-/Privatmethoden verwenden. Eine Drupal . Module Datei ist jedoch keine Klasse.

Die Idee ist, große Methoden aus dieser Datei in besser lesbare und wiederverwendbare kleinere Methoden aufzuteilen.

Was ist der richtige Weg, um helper/private Methoden aus einer Drupal . Module Datei aufzurufen?

4
Kwadz

Ich befolge immer die Symfony-Standards, wenn es um Hilfsfunktionen geht. Normalerweise habe ich ein Modul für Entwickler-zentrales Material, in dem ich unter src/Utils Eine Klasse hinzufüge und sie dann überall dort aufrufe, wo ich sie brauche. Auch in *.module Oder *.theme Dateien.

web/modules/custom/my_module/src/Utils/MyHelperFunctions.php

namespace Drupal\my_module\Utils;

/**
 * Class MyHelperFunctions.
 */
class MyHelperFunctions {

  /**
   * Get current multisite directory name.
   *
   * @return string
   *   The basename of the matching multisite directory.
   */
  public function getMultisiteAlias() {

    $site_path = \Drupal::service('site.path');
    $site      = explode('/', $site_path);

    return $site[1];
  }

}

web/modules/theme/custom/my_theme/my_theme.theme

use Drupal\my_module\Utils\MyHelperFunctions;

/**
 * Implements template_preprocess_html().
 */
function my_theme_preprocess_html(&$variables) {

  // Add multisite body class.
  $site = MyHelperFunctions::getMultisiteAlias();

  $variables['attributes']['class'][] = 'site-' . $site;
}

@NoSssweat schlug vor, dass der drupalitisch korrektere Weg, dies zu tun, darin besteht, einen Dienst zu erstellen, mit dem diese Methode auch von anderen Modulen über die Abhängigkeitsinjektion aufgerufen werden kann.

web/modules/custom/my_module/my_module.services.yml

services:
  my_module.helper_functions:
    class: Drupal\my_module\Utils\MyHelperFunctions

Und dann müssten Sie den Namespace nicht mehr use, sondern können den Dienst einfach anrufen, wo immer Sie möchten:

\Drupal::service('my_module.helper_functions')->getMultisiteAlias();

Lesen Sie mehr: Wann sollte ich einen Dienst oder eine Dienstprogrammfunktion erstellen?

6
leymannx

Für Benutzer, die OOP bevorzugen, können wir anstelle des herkömmlichen Hook-Systems Drupal Hook-System) das Ereignissystem mit dem Modul Hook Event Dispatcher verwenden, das Ereignisse für mehrere = auslöst Drupal Core Hooks.

Möglicherweise werden alle Hooks in Drupal wie beschrieben hier und hier ersetzt.

2
Kwadz

Die Antwort von Kwadz ist die bisher sauberste, aber hier ist eine andere Lösung: In unserem Projekt erstellen wir Klassen für Hooks:

/**
 * Implementation of hook xyz.
 */
function my_module_some_hook($arguments) {
  MyHookClass::create(\Drupal::getContainer())->myMethod($arguments);
}

In Ihrer Klasse müssen Sie nur ContinaterInjectionInterface implementieren, und schon kann es losgehen. Sie können jetzt alles in OO] tun, aber Sie können bei Bedarf auch Unit-Tests dafür schreiben.

0
ssibal