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?
\Drupal::moduleHandler()
oder injizieren Sie in Ihre eigene containerbewusste Klasse, um eine vollständig instanziierte Version zu erhalten\Drupal::moduleHandler()->loadInclude($foo, $bar);
(die "Verwendung" ist Teil des Textes in diesem letzten Kommentar, nicht der Code, kann verstehen, warum es verwirrend ist)Antworten:
Die Antwort ist, dass die Lademethode nicht die richtige Methode ist und es eine bestimmte loadInclude () -Methode gibt.
quelle
ModuleHandler::loadInclude
ist 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\Drupal::moduleHandler()->loadInclude($foo, $bar);