Was ist die richtige oder bevorzugte Verzeichnisstruktur für ein Zend Framework 2 Modul?

8

Ich möchte Zend Framework 2 in den Griff bekommen, indem ich es für ein kleines Projekt verwende. Ich habe verschiedene Artikel über Blogs, Dokumente und natürlich das fantastische Tutorial von Akrabat (Rob Allen) gelesen.

Bei all dem, was ich gelesen habe, habe ich jedoch keine Erklärung über die richtige oder bevorzugte Verzeichnisstruktur für ein Modul gefunden, das Zend Framework 2 erwartet.

Im Akrabat-Tutorial nutzt Rob Allens Beispielmodul ein einzelnes Modell und einen Controller. Die Verzeichnisstruktur, die er auswählte, war:

%Vor%

Das ist alles in Ordnung, aber was wäre, wenn ein Modul mehrere Controller und Modelle hätte, wie Sie es von einer Site mit mehreren Seiten / Abschnitten erwarten würden? Würde ich alle meine Controller in das Verzeichnis / src / Album / Controller stellen, oder würde ich einen weiteren Satz von / src / xxx / -Verzeichnissen für jedes zusätzliche Modell und zugehörige Controller und Ansichten erstellen?

Unterteile ich es in den / view-Verzeichnissen in Unterverzeichnisse für jeden Satz von Ansichten, die von den verschiedenen Controllern verwendet werden?

Ich denke, die Verwirrung für mich kommt von der Tatsache, dass in Robs Beispiel sein Hauptcontroller / Modell derselbe Name wie das Modul ist. Sein Album Modul hat also ein Verzeichnis mit mehr Album Verzeichnissen für die Modelle, Controller und Ansichten. Wenn ich sein Modul von Album in zB MyModule umbenennen würde, würde die Verzeichnisstruktur dann zu

werden %Vor%

Würde dann folgen, dass ein zusätzliches Modell, Künstler , und die zugehörigen Controller so organisiert wären:

%Vor%

Wenn nicht das Obige, welche Struktur wäre es dann?

Das setzt natürlich voraus, dass ZF2 eine strikte Struktur erwartet. Wenn das nicht der Fall ist, dann kann ich es offensichtlich so organisieren, wie ich es möchte.

    
Etzeitet 08.08.2012, 11:14
quelle

1 Antwort

14

Um Ihre letzte Frage schnell zu beantworten - ZF2 kümmert sich in der Tat nicht um die Verzeichnisstruktur. Oder ich sollte eher sagen - es hat keine vordefinierte Struktur. Das ist der Grund, warum es die Autoloader-Konfigurationen und Klassenzuordnungen hat (abhängig davon, welchen Ansatz Sie verwenden).

Der 'Standard' Autoloader (siehe Module.php), den Sie in den meisten Beispielen finden können, setzt nur voraus, dass Ihre ModuleName-Klassen im Verzeichnis ./src/ModuleName gefunden werden:

%Vor%

Ich nehme an, Sie wissen, dass das __NAMESPACE__ Teile bedeuten.

Wenn Sie also ein Modul namens Cat haben, würden die Klassen in ./modules/Cat/src/Cat erwartet.

Wenn Sie dann entscheiden würden, Ihrer Anwendung einige neue Funktionen hinzuzufügen, fügen Sie ein weiteres Modul mit dem Namen Dog hinzu und platzieren Sie seine Klassendateien in ./Dog/src/Dog .

Das bedeutet jedoch keineswegs, dass Sie es auf diese Weise tun müssen. Sie könnten auch alle Ihre tierbezogenen Klassen in einem Modul namens z. %Code%. Sie müssten Ihren Autoloader so anpassen, dass er wie folgt aussieht:

%Vor%

... und platziere deine Klassen in Dateien wie Animals und ./modules/Animal/src/Cat/Persian.php .

Eine Sache, die ich vorschlagen würde, ist, über Module als separate Einheiten nachzudenken, die nichts Spezifisches über die anderen Module wissen. Als ein "reales" Beispiel - ich habe eine Anwendung, die ein Frontend (HTML, CSS, etc.) und eine API-Funktionalität hat.

Ich habe 3 Module:

  • ./modules/Animal/src/Dog/Collie.php - enthält Datenbankkonfigurationen, db-Tabellenklassen, Mapper, Modelle, Authentifizierungsklassen usw. Grundsätzlich alles, was ein anderes Modul benötigen könnte.
  • Application - Controller erwarten Anforderungen in einem bestimmten Format und geben sie als z. JSON (d. H. Keine Ansichten erforderlich). Klassen in diesem Modul verwenden Klassen aus dem Anwendungsmodul, da ich immer noch die gesamte Datenbankfunktionalität benötige, aber alles separat zu haben, gibt mir die Trennung der anwendungsweiten Logik von der API-Logik. Ich könnte dieses Modul herausreißen, ich wollte es und es würde nichts anderes kaputt machen.
  • Api - Modul, das nur für das Rendern von Seiten zuständig ist. Erneut werden Klassen aus der Anwendung verwendet, da ich Daten aus der Datenbank rendern und die Benutzer bearbeiten lassen möchte, aber ich möchte die Funktionalität nicht nur in diesem Modul haben, wie es Api benötigt.

Meine Website lädt sie in dieser Reihenfolge:

%Vor%

Dies bedeutet, dass ich Zugriff auf die Anwendungsklassen von allen anderen Modulen habe. Wenn ich meine API aus irgendeinem Grund deaktivieren wollte, würde ich einfach das Api-Verzeichnis entfernen und mein Frontend würde immer noch funktionieren.

Hoffe, das hilft! :)

TL; DR Sie können Dateien beliebig strukturieren, vergessen Sie nicht, den Autoloader korrekt zu konfigurieren.

    
Andris 09.10.2012, 18:29
quelle