Was entspricht module_load_include ()?

7

Ich habe viel Erfahrung mit D7, aber nicht viel mit D8, daher frage ich mich, wie D8 hier "richtig" vorgeht.

Also habe ich ModuleA und ModuleB

Modul B hängt von Modul A ab.

Ich muss eine Funktion von ModuleA innerhalb von ModuleB aufrufen.

In D7 wurde dies von module_load_include () durchgeführt, und D8 scheint sowohl diese Funktion als auch die ModuleHandler-Klasse zu haben.

Ich versuche, diese Klasse zu instanziieren und die Lademethode zu verwenden, aber es wird ein Fehler ausgegeben, weil ich nichts an den Konstruktor übergebe:

$ module_handler = new \ Drupal \ Core \ Extension \ ModuleHandler; $ module_handler-> load ('ilib_connect');

TypeError: Argument 3 passed to Drupal\Core\Extension\ModuleHandler::__construct() must implement interface Drupal\Core\Cache\CacheBackendInterface, none given, called in /var/www/company/web/modules/custom/ilib_sso/ilib_sso.module on line 31 in Drupal\Core\Extension\ModuleHandler->__construct() (line 109 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

Daher übergebe ich derzeit nichts an den Konstruktor (nicht sicher, was genau übergeben werden soll), und das statische Aufrufen der Methode ist kein Problem, da die load () -Methode auf ihr Objekt verweist und daher diesen Fehler verursacht:

Error: Using $this when not in object context in Drupal\Core\Extension\ModuleHandler::load() (line 122 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

Wie soll ich diese bestimmte Klasse verwenden? Oder sollte ich einfach module_load_include () verwenden?

Wie macht Drupal 8 Dinge?

Jack Ryan
quelle
Sie müssen also den Prozedurcode aus Modul A von w / in Modul B prozedural aufrufen, und der Code von Modul A befindet sich in einem Include?
mpdonadio
Der Modulhandler ist ein Dienst. Verwenden Sie \Drupal::moduleHandler()oder injizieren Sie in Ihre eigene containerbewusste Klasse, um eine vollständig instanziierte Version zu erhalten
Clive
use \ Drupal :: ModuleHandler (); scheint einen Syntaxfehler auszulösen.
Jack Ryan
1
Nur \Drupal::moduleHandler()->loadInclude($foo, $bar);(die "Verwendung" ist Teil des Textes in diesem letzten Kommentar, nicht der Code, kann verstehen, warum es verwirrend ist)
Clive
1
Hinweis: Solange es noch vorhanden ist, sollte es nur sehr wenige Gründe geben, es in 8.x weiterhin verwenden zu müssen. Dies ist nur erforderlich, wenn ein Modul (API-) Funktionen in einer separaten Datei hat, die nicht automatisch geladen wird. Dies sollte nicht mehr gemacht werden, dafür sind die Dienste in 8.x gedacht. Klingt nach einem Modul, das nicht vollständig auf 8.x-Konzepte portiert oder mit 7.x-Konzepten geschrieben wurde.
Berdir

Antworten:

6

Die Antwort ist, dass die Lademethode nicht die richtige Methode ist und es eine bestimmte loadInclude () -Methode gibt.

\Drupal::moduleHandler()->loadInclude('ilib_connect', 'module');
Jack Ryan
quelle
2
ModuleHandler::loadIncludeist nicht statisch, du solltest es nicht statisch aufrufen, die Tatsache, dass du es kannst, ist nur ein Überbleibsel des alten PHP-Unsinns, es wird E_STRICT in PHP5 erzeugen, möglicherweise schlimmer in 7. Auch von der Drupal-Seite könnte es dir nein verursachen Probleme jetzt, aber wenn sich die Implementierung ändert (z. B. zu verwenden $this), könnte es Sie in Zukunft scheitern. Die
Clive
1
Okay, ich werde das dann löschen.
Jack Ryan
2
Oder Sie können es einfach bearbeiten. Die richtige Out-of-Container-Methode lautet:\Drupal::moduleHandler()->loadInclude($foo, $bar);
Clive