Ich habe gerade die fehlende Information gefunden.
EDIT: Und noch eine.
Problem mit module_invoke ()
module_invoke_all()
ruft immer auf module_implements()
, wodurch die Modul-Include-Datei überprüft wird, indem sowohl hook_hook_info()
und als auch überprüft werden hook_module_implements_alter()
.
Allerdings module_invoke()
nur Schecks hook_hook_info()
und nicht hook_module_implements_alter()
.
module_invoke()
heißt zB in _block_render_blocks()
für hook_block_view()
. Dies bedeutet, dass dies hook_module_implements_alter()
keine gute Lösung ist, um eine hook_block_view()
Implementierung in eine separate Datei aufzuteilen .
Dies war ein Problem in Crumbs, siehe https://www.drupal.org/node/2328535 .
Bei anderen Hooks funktioniert es im Allgemeinen in Ordnung, aber Sie wissen nie, ob ein bestimmtes Modul module_invoke()
anstelle von verwendet werden soll module_invoke_all()
.
Modul_implements () Cache im Bootstrap verschmutzt.
Ein weiteres Problem wird durch ein Kernproblem verursacht, das hier gemeldet wird:
module_implements_cache () kann durch Hook_boot () -Implementierungen verschmutzt werden, die module_invoke_all () direkt oder indirekt aufrufen
Dies gilt nur für Nicht-Boot-Module , bei denen es vorkommen kann, dass die Implementierung von hook_module_implements_alter()
nie erkannt wird.
- Eine unerwartete Kette von Ereignissen führt dazu,
module_implements($hook)
dass von aufgerufen wird hook_boot()
.
Dies $hook
kann ein beliebiger zufälliger Hook sein, er muss nicht mit dem Modul verknüpft sein, an dem wir arbeiten.
- Dies führt
module_implements('module_implements_alter')
dazu, dass aufgerufen wird.
- Drupal sucht nach allen Implementierungen von
hook_module_implements_alter()
. Zu diesem Zeitpunkt MODULENAME.module
ist noch nicht enthalten.
Für den Rest der Anforderung geht Drupal daher davon aus, dass die Implementierung MODULENAME_module_implements_alter()
nicht vorhanden ist.
- Später in der Anforderung werden Implementierungen anderer Hooks erkannt, aber die Implementierungen von MODULENAME werden nicht gefunden, da sie
MODULENAME_module_implements_alter()
nicht ausgeführt werden.
Alternativen
einmalig benötigt
Alternativen wurden bereits erwähnt. Anstelle dieser Tricks kann man die Datei direkt einbinden. Es kann eine winzige Auswirkung auf die Leistung geben, aber dies wird wahrscheinlich von vielen anderen Dingen in Drupal überschattet.
Aber anstatt zu verwenden module_load_include()
, würde ich eine direktere Lösung vorschlagen:
require_once __DIR__ . '/crumbs.block.inc';
Oder um PHP 5.2-kompatibel zu sein:
require_once dirname(__FILE__) . '/crumbs.block.inc';
Warum nicht module_load_include ()?
Es besteht im Allgemeinen keine Notwendigkeit zum Aufrufen module_load_include()
, es kann sogar schädlich sein, wenn die * .module-Datei von you-dont-know-where (z. B. from settings.php
) enthalten ist und Sie nicht wissen, ob sie module_load_include()
verfügbar ist.
Diese Funktion dient hauptsächlich dazu, den Standort anderer Module zu bestimmen . Wenn Sie jedoch in dasselbe Modul aufnehmen , ist es im Allgemeinen sicherer und einfacher und schneller, mit relativen Dateipfaden und expliziten zu arbeiten require_once
.
Rufen Sie die Hilfsfunktion auf
Wie von Jimajamma erwähnt, können Sie den Hook auch in der Hauptdatei implementieren *.module
, dann eine andere Datei einschließen und von dort aus eine Hilfsfunktion aufrufen. Dies erfolgt zB in der Display Suite.
Diese Lösung ist in Ordnung, obwohl ich denke, dass sie die Hauptdatei immer noch überfüllt und Ihnen noch mehr Orte bietet, an denen Sie suchen können.
Und auch hier können Sie require_once anstelle von verwenden module_load_include()
, wenn es sich innerhalb desselben Moduls befindet.