In der Ankündigung der neuen Version ist mir etwas aufgefallen. Aus dem Titel wissen Sie, dass es sich um das Hook-Attribut handelt.
Für die Leute, die sich mit PHP-Attributen nicht auskennen: Ich habe vor einiger Zeit einen Beitrag darüber geschrieben.
Die Art und Weise, wie Sie Hooks hinzufügen mussten, war für mich ein Dorn im Auge, seit Drupal 8 zu einer objektorientierten Art der Codestrukturierung übergegangen ist.
Die Verwendung des Modulnamens als Präfix für die Funktionen und die Verwendung der .module-Datei zum Hinzufügen aller Funktionen hatte für mich ein Gefühl von Spaghetti-Code.
Und jetzt haben sie es fast behoben. Fast weil es eine Reihe von Haken gibt, die immer noch prozedural sind. Der Plan besteht darin, die prozeduralen Haken in Drupal 12 zu entfernen, sodass diese Haken in den nächsten Nebenversionen von Drupal verschwinden werden.
Anstatt Funktionen zur .module-Datei hinzuzufügen, befinden sich die Hooks im src-Verzeichnis des Moduls.
Ich schlage vor, zur einfacheren Identifizierung ein Hooks-Unterverzeichnis zu verwenden. Oder fügen Sie das Hooks-Suffix zum Klassennamen hinzu.
Da es sich um ein Attribut handelt, können Sie mehrere Hooks an dieselbe Methode binden.
// module.module function module_comment_insert(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_update(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_manipulation(CommentInterface $comment) { // do something } // with Hook attribute class CommentHooks { #[Hook('comment_insert')] #[Hook('comment_update')] public function commentInsertOrUpdate(CommentInterface $comment) { // do something } }
Für die Leute, die Module für Drupal-Versionen vor 11.1 pflegen, gibt es ein zusätzliches Attribut, LegacyHook. Dadurch können Sie den Code des Hooks in die Klasse mit Hook-Attribut verschieben. Und die alten Versionen von Drupal führen die Funktion in der .module-Datei aus, aber die neueren Versionen führen nur die Klassenmethode aus.
// module.module #[LegacyHook] function module_comment_insert(CommentInterface $comment) { new CommentHooks()->commentInsertOrUpdate($comment); } #[LegacyHook] function module_comment_update(CommentInterface $comment) { new CommentHooks()->commentInsertOrUpdate($comment); }
Wie Sie den vorherigen Codebeispielen entnehmen können, wird das Attribut zur Methode hinzugefügt.
Sie können die Methode aber auch zur Klasse hinzufügen.
#[Hook('comment_insert')] #[Hook('comment_update')] class CommentManipulationHook { public function __invoke(CommentInterface $comment) { // do something } }
Wie ich im Beispiel zeige, schlage ich vor, den Klassennamen aussagekräftiger zu gestalten. Und verwenden Sie das Suffix Hook anstelle von Hooks.
Sie können der Klasse die Hook-Attribute hinzufügen und die Methode als zweiten Parameter hinzufügen. Ich empfehle dies nicht. In diesem Fall ist es sauberer, das Attribut zur Methode hinzuzufügen.
Es gibt einen dritten Hook-Parameter, Modul. Und das ermöglicht Ihnen, eine Hook-Klasse von einem anderen Modul aus auszuführen. Zum Beispiel #hook('comment_insert', 'commentInsert', 'my_comment_module').
Ich habe über einen Anwendungsfall dafür nachgedacht, konnte aber keinen finden.
Wenn Sie einen kennen, lassen Sie es mich wissen.
Ich liebe es, zu sehen, wie sich Drupal-Code in die richtige Richtung bewegt.
Das Einzige, was mich gestört hat, ist, dass die Haken magische Konstanten sind. Der Plan besteht jedoch darin, alle Hook-Attribute mit dem Hook-Attribut als Basisklasse zu versehen. Anstelle von #[Hook('comment_insert')] wird es also #[CommentInsert] sein.
Eine andere Möglichkeit wäre die Verwendung von Enumerationen, gruppiert nach Modulen.
// module.module function module_comment_insert(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_update(CommentInterface $comment) { module_comment_manipulation($comment); } function module_comment_manipulation(CommentInterface $comment) { // do something } // with Hook attribute class CommentHooks { #[Hook('comment_insert')] #[Hook('comment_update')] public function commentInsertOrUpdate(CommentInterface $comment) { // do something } }
Die Informationen in diesem Beitrag basieren auf der Dokumentation und dem kurzen Blick, den ich auf die Implementierung geworfen habe. Wenn ich die Funktion getestet habe, wird es Aktualisierungen oder einen zusätzlichen Beitrag geben.
Das obige ist der detaillierte Inhalt vonNeues Drupal-Hook-Attribut. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!