Was sind die verschiedenen Arten von Haken?

7

In einem alten Blog-Beitrag bezieht sich Larry Garfield auf Hooks im "Registry-Stil" und Hooks vom Typ hook_nodeapi.

Wenn es darum geht, die verschiedenen Arten von Haken aufzuschlüsseln, scheint es keine Dokumentation zu geben. Es gibt eine große Liste von Hooks und Tim Plunkett hat zwei Defgruppen gefunden, die sich mit Hooks befassen, aber es scheint keine formale Aufschlüsselung der verschiedenen Arten von Hooks zu geben, die wir haben.

Wie würde eine solche Aufteilung aussehen?

Linclark
quelle
Interessante Frage. Sind Sie nach einer theoretischen Diskussion oder gibt es ein bestimmtes Problem, das Sie lösen möchten?
Marcvangend
2
Ich frage nach ein paar Gründen. 1) hilft beim Schreiben meiner Diplomarbeit 2) wäre gut für die Dokumentation, da die verschiedenen Arten von Hooks Newbs verwirren 3) wäre gut zu wissen, wenn Module entworfen und für die Kernentwicklung, hilft, Best Practices zu isolieren und wo Best Practices nicht vorhanden sind place
linclark

Antworten:

7

Ich würde sie in drei, vier Gruppen einteilen, aber es gibt keinen technischen / internen Unterschied zwischen ihnen. Alle sind nur Funktionen, die aufgrund von Namenskonventionen aufgerufen werden.

  1. Info-Haken. Hooks, die Informationen zu etwas liefern, typische Beispiele sind hook_entity_info () , hook_field_info () , hook_hook_info (), aber auch hook_permission () , hook_menu () , hook_theme () usw. Viele davon haben ein _infoSuffix, müssen es aber nicht unbedingt . Diese Hooks können jederzeit aufgerufen werden und die zurückgegebenen Informationen werden häufig zwischengespeichert (statischer Cache oder persistenter Cache) oder in bestimmten Tabellen gespeichert (z hook_menu(). B. ).

  2. Reaktiv- / Aktionshaken. Ich erfand gerade diesen Namen, aber diese sind Haken , die , wenn etwas Bestimmtes happenend wie genannt werden hook_init () , hook_node_save(), hook_user_save(), hook_node_view () und so weiter.

  3. Haken ändern. Hooks, mit denen etwas geändert werden kann, das von anderen Modulen bereitgestellt wird, gibt es für fast alle Info-Hooks (z. B. hook_menu_alter () oder hook_entity_info_alter () ) sowie für einige Action-Hooks (z. B. hook_node_view_alter () ).

Es gibt auch eine vierte Gruppe, aber diese sind eigentlich keine wirklichen Haken und sie sind einer der Hauptgründe für die typische Verwirrung über Haken. Sie werden oft als "Rückrufe" bezeichnet. Dies sind "Hooks", die nur für ein einzelnes Modul aufgerufen werden, das etwas besitzt. Typische Beispiele sind Rückrufe vom Knotentyp (hook_submit, hook_view, hook_form, ...), viele Feld-Hooks (z. B. hook_field_load () ), aber auch hook_block_view () . Es gibt Pläne, diese zu entfernen und durch etwas anderes (oop-basiert) zu ersetzen oder sie in etwas anderes als Hooks umzubenennen.

Ich gehe davon aus, dass es auch einige Hooks gibt, die in keiner dieser Gruppen richtig platziert werden können oder eine Mischung dieser Gruppen sind. Wenn ja, könnte dies ein Zeichen dafür sein, dass sie neu gestaltet werden sollten. Wenn jemand Beispiele kennt, kann ich sie hier hinzufügen.

Haftungsausschluss: Dies ist nicht offiziell, aber wie ich es sehe. Mit Vorsicht verwenden. ;)

Berdir
quelle
0

Ich glaube nicht, dass er beim Lesen von Larrys Blog-Post sagen wollte, dass es nur zwei Arten von Hooks gibt (Registrierungsstil und Nodeapi-Stil). Soweit ich weiß, sind keine offiziellen Arten von Haken definiert. Grundsätzlich sind alle Haken technisch ähnlich, aber es gibt einen Unterschied, was sie tun und wann sie es tun.

Hooks können an einer beliebigen Stelle zwischen der ersten http-Anforderung und der Rückgabe der Ausgabe aufgerufen werden. Die meisten Hooks sollen die Ausgabe (normalerweise HTML) auf die eine oder andere Weise beeinflussen (nennen Sie sie "normale Hooks", wenn Sie möchten ), wie zum Beispiel hook_init .

Einige Haken sind nicht gemeint , die Ausgabe direkt beeinflussen, sondern sie ergänzen oder einen Registry ändern , die in der Datenbank gespeichert wird. Dies nennt Larry Hooks im Registrierungsstil. Sie werden nicht oft aufgerufen, sondern erstellen eine dauerhafte Liste von Werten, die immer wieder verwendet werden können. Das Speichern in der Datenbank als Registrierung verbessert die Leistung. Dies tun unter anderem hook_menu und hook_theme .

Der im Blog erwähnte 'nodeapi-Stil' bezieht sich auf Hooks, die eine Reihe von Unterroutinen in einer einzelnen Hook-Implementierung bündeln. In D6 kann eine Implementierung von hook_nodeapi auf mehrere Ereignisse reagieren, z. B. das Speichern eines Knotens, das Anzeigen eines Knotens und das Löschen eines Knotens. Diese Art von Haken existiert in D7 nicht mehr . Zum Beispiel wurde der einzelne hook_nodeapi durch hook_node_insert, hook_node_view, hook_node_delete und eine Reihe ähnlicher Hooks ersetzt.

Marcvangend
quelle
Ich wollte nicht vorschlagen, dass es nur zwei Arten von Haken gibt. Ich suche nach einer Kategorisierung der verschiedenen Hooks. Zum Beispiel gibt es einige Callback-Hooks (die wahrscheinlich überhaupt keine Hooks sein sollten, wie Berdir mit seiner vierten Gruppe oben betont), die nur mit dem im Modul definierten Knotentyp arbeiten.
Linclark
OK, ich war mir nicht sicher, ob Sie das vorschlagen wollten. Wie auch immer, ich denke meine Antwort stimmt mit Berdirs 3 + 1 Kategorien überein, ich unterstütze seine Antwort.
Marcvangend
0

Eine Möglichkeit, sie aufzuteilen, besteht in der Eingabe und Ausgabe: 1) nur Eingabe, 2) nur Ausgabe, 3) Eingabe-Ausgabe und 4) keine Eingabe, keine Ausgabe.

Es gibt nicht viel von # 1, da fast alles, was passiert, eine Reaktion haben könnte. Die einzigen Beispiele, an die ich denken kann, sind Lösch-Hooks, z. B. hook_file_delete (), hook_comment_delete (), bei denen der Hook das gelöschte Objekt erhält, dieses Objekt jedoch bereits gelöscht ist. Es gibt also keinen Grund für eine Antwort.

Die "Registry-Style" -Hooks wären # 2 und würden nur ausgegeben. Sie geben nur Daten in eine zentrale Registrierung ein und nehmen keine Eingaben entgegen. hook_menu () und hook_help () sind Beispiele.

hook_nodeapi () war # 3, aber jetzt ist es in verschiedene Funktionen unterteilt, wie hook_node_presave () - immer noch # 3 - und hook_node_delete () - was jetzt # 1 ist. Dies ist die häufigste Gruppe. Viele der Beispiele haben explizit das Wort "alter" im Hook-Namen, z. B. hook_form_alter ().

So etwas wie hook_init () wäre # 4. Über die allgemeine Benachrichtigung über ein Ereignis hinaus gibt es keine Eingabe oder Ausgabe.

Das ist allerdings eine ziemlich willkürliche Aufschlüsselung. Sie könnten leicht argumentieren, # 3 in Hooks aufzuteilen, bei denen die Ausgabe dieselbe Struktur wie die Eingabe (alter) hat, im Gegensatz zu Hooks, bei denen die Ausgabe eine völlig andere Struktur hat (Call-Response). Oder Sie können # 1 und # 4 kombinieren, da der Funktionsaufruf selbst eine Art Eingabe ist, sodass der Unterschied nur in der Detailstufe liegt.

Scott Reynen
quelle
hook_menu_alter ist ebenfalls nur eine Registrierung, aber es "nimmt Eingaben entgegen".
tim.plunkett