Menü Gebäude Muster

9

Ich habe Probleme, mich mit der aktiven Bearbeitung eines Menüs zu befassen, wenn das Menü nicht für das Routing verwendet wird.

Ich komme aus Drupal, wo das Menüsystem auch das Routing übernimmt. Das Einstellen des aktiven Status und des aktiven Trail-Status wird also von der Route übernommen (die auch als Menü-Rendering-System fungiert).

Viele PHP-Frameworks verfügen jetzt über Router-Klassen, die das Routing übernehmen. Dies scheint eine gute Trennung zu sein, da ein Menü POST || nicht kennen sollte OPTIONEN || ... Anfragen.

Aber als ich das Frontend schrieb, fiel es mir schwer, das Menü zu codieren. Oder alles in der Datenbank speichern und diese Werte an eine Ansicht übergeben. Was mir an diesem Ansatz nicht gefällt, ist, dass Sie eine Kopie dessen erstellen, was Sie bereits in Ihrem Router geschrieben haben, aber jetzt die Menüklasse verwenden.

Ein Beispiel:

Route::get('/somewhere','routename.somewhere','showStuffController');
Route::post('/somewhere','routename.somewhere','saveStuffController');

Menu::add('label.somewhere','routename.somewhere');

Sie trennen hier Bedenken, das ist schön. Das Menü hängt jedoch stark von der Route ab, um den aktiven Status festzulegen. Das Menü muss auch über die Hierarchie Bescheid wissen, um den aktiven Pfad festzulegen.

Ja, das Festlegen eines aktiven Trails und aktiver Statusklassen ist eigentlich eine Ansichtssache. Aber mit

if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; }

Überall scheinen deine Ansichten dumm zu sein. Fügen Sie dann all diese nervigen Active-Trail-Ifs hinzu und es ist ein echtes Aufblähen. Das zu handhaben, bevor die Ansicht gerendert wird, und das Setzen eines Active-Trail-Flags auf true, scheint so hässlich, wie ich es kenne (eine foreach-Schleife über alle Kinder, die alle Kinder durchläuft, ...)

Meine Frage ist:

Gibt es ein Muster oder einen intelligenten Weg, um diesen Reiniger besser zu machen, ...? Wie soll man mit dem Active-Trail-Problem umgehen?

Ich dachte daran, Kind -> Eltern zu rendern. Beginnen Sie also mit der Anzeige auf der tiefsten Ebene und arbeiten Sie sich dann nach oben. Aber dann weiß das Kind über seine Eltern Bescheid, aber die Eltern wissen nichts über seine Kinder (scheint seltsam).

Pinoniq
quelle

Antworten:

1

wenn das Menü nicht für das Routing verwendet wird

Ich würde sagen , dass Routing kann für das Menü verwendet werden.


Wie Sie bereits betont haben, wäre der Router ein guter Ort, um sich anzuschließen. Ich denke nicht, dass es hässlich wäre, einen Haken zu verwenden, der das Menü-Meta für die aktuelle Seite bei jeder Anfrage auswertet.

Wenn Sie Ihre Ansichten für die Verfolgung des aktiven Status verantwortlich machen, trennen Sie keine Bedenken. Die Ansichten sollten das tun, wofür sie gemacht sind - es ist jedoch nicht erforderlich, dass sie auch ihren Menüstatus verwalten. Die Menü-Metadaten sind normalerweise anwendungsweit gleich und Sie benötigen nur die Route, um sich selbst zu finden und das Menü zu rendern.

Abhängig von Ihrem Router und Ihren Anforderungen würde eine einfache Funktion oder Klasse, die einige statische Menü-Metadaten und die aktuelle Route verwendet, ausreichen, um alle Informationen bereitzustellen, die Sie anschließend benötigen.

Das Menü Meta selbst muss nicht unbedingt ein Objekt sein. In den meisten Fällen sollte eine einfache Schlüsselwertdatenstruktur ohne Methoden ausreichen.

Der Hook erstellt möglicherweise ein Statusobjekt mit einigen allgemeinen Funktionen, die sich auf Ihr Menü beziehen, z. B. Breadcrumbs, Tiefe, übergeordnete Seite oder aktuelle Seite, und macht dieses Objekt im Kontext Ihrer http-Anforderung bekannt. Sie haben verschiedene Möglichkeiten innerhalb des Hooks - aber im Allgemeinen geht es darum, notwendige Daten zu sammeln, vorzubereiten und an etwas weiterzugeben, das weiß, wie man damit umgeht.

Dieser Ansatz passt sich Ihren Anforderungen an und bietet einige Vorteile:

  1. Ihre Datenbank muss sich nicht mit Daten befassen, die Sie zur Laufzeit mit geringen Kosten bereitstellen können
  2. Sie haben Ihr Menü (Meta) an einem Ort, wodurch es wartbar ist
  3. Wenn Sie möchten, dass Ihr Menü vollständig 1: 1 auf Ihren Routen basiert, können Sie dies erreichen, indem Sie Menü-Meta dynamisch bereitstellen
  4. Wenn Ihr Inhalt (und damit das Menü) wächst, können Sie diese Daten in die Sitzung verschieben, die möglicherweise in einen schnellen Schlüsselwertspeicher geschrieben wird
Dahrens
quelle