Gibt es neben der Präsentations-Abstraktions-Kontrolle und anderen Mustern , die im Drupal-Kern verwendet werden , noch andere Entwurfsmuster, die in den populäreren Modulen wie Ansichten, CCK und Funktionen prominent verwendet werden ?
Gibt es neben der Präsentations-Abstraktions-Kontrolle und anderen Mustern , die im Drupal-Kern verwendet werden , noch andere Entwurfsmuster, die in den populäreren Modulen wie Ansichten, CCK und Funktionen prominent verwendet werden ?
Antworten:
Ein Ausgangspunkt ist der Kern selbst und die Muster, die dazu beitragen. - Eine großartige Zusammenfassung von Larry Garfield (Crell) finden Sie in einem Artikel von Drupal Watchdog .
Beobachter, Besucher und guckende Toms
Drupal basiert auf den Zwillingsmustern von Observer und Visitor, nennt sie jedoch nicht beim Namen. Stattdessen nennt es sie Hooks.
hook_node_load()
,hook_user_login()
Und sind so weiter, im Wesentlichen Beobachter auf Knoten und Benutzern.hook_form_alter()
,hook_node_view()
Und sind so weiter, im Wesentlichen Besucher. Da Drupal nicht zwischen den beiden unterscheidet, könnten einige Haken wohl als beide Muster betrachtet werden, aber das Prinzip ist dasselbe.Fabriken und Befehle
Es gibt verschiedene Variationen des Factory-Musters, aber alle laufen auf dieselbe Idee hinaus: Ein Objekt, ein Client, fragt ein anderes Objekt, eine Factory, nach einer geeigneten Implementierung einer Logik, aber es ist ihm egal, um welche es sich handelt . Die Entscheidung liegt bei der Fabrik. Betrachten Sie die
db_insert()
Funktion, deren wichtige Teile unten aufgeführt sind:function db_insert($table, array $options = array()) { // ... return Database::getConnection($options['target'])->insert($table, $options); }
Die
Database::getConnection()
Methode ist eine Factory, die ein für diese Site geeignetes Verbindungsobjekt zurückgibt.Abhängigkeitsinjektion von Doktor Drupal
In Drupal 6 wurde das Menüsystem entkernt und in einen mehrstufigen Prozess umgeschrieben. Wir würden jetzt den gleichen Seitenrückruf wie folgt implementieren:
function example_menu() { $items['node/%node/example'] = array( 'page callback' => 'example_page', 'page arguments' => array(1), // ... ); return $items; } function example_page($node) { // Do useful stuff here. }
In diesem neuen Setup wird der Menü-Router komplexer. Im Gegenzug erhält der Seitenrückruf jedoch den Knoten, von dem er abhängt, an ihn übergeben, dh in ihn injiziert. Das gibt uns eine Reihe von Vorteilen.
Gehen Sie für Broke (r)
Ein gängiger Ansatz ist eine Variation der Idee eines Brokers oder Mediators. In diesem Entwurf fordert ein Objekt keine Informationen direkt von einem anderen Objekt an. Stattdessen bittet es ein Zwischenobjekt, das möglicherweise in das Objekt injiziert wurde, eine solche Anfrage in seinem Namen zu stellen. Während dies immer noch bedeutet, dass das erste Objekt aktiv Informationen anfordern muss, ist es nur eng mit dem Mediatorobjekt verbunden und nicht mit der Vielzahl anderer Objekte, von denen es möglicherweise Informationen anfordern muss. Das heißt, wenn sich diese anderen Systeme ändern, müssen wir nur den Mediator aktualisieren, nicht jedes System, das ihn berührt.