Wie man die gleichen Modelle in verschiedenen Modulen im Zend Framework verwendet?

8

Ich arbeite an der Implementierung von Zend Framework in einem bestehenden Projekt mit einem öffentlichen Marketingbereich, einem privaten Mitgliederbereich, einer Verwaltungssite und einer Marketingkampagnen-Verwaltungssite. Gegenwärtig sind diese mit den Controller-Skripten für den Marketingbereich und den Mitgliederbereich, die alle unter dem Stamm der Site und dann einem separaten Ordner für den Administrator und einem anderen Ordner für die Marketingkampagnen-Site sind, schlecht organisiert.

Bei der Implementierung des Zend Framework möchte ich in der Lage sein, die Controller und Ansichten in Module zu teilen (eine für den Mitgliederbereich, eine für den öffentlichen Marketingbereich, eine für die Admin-Site und eine für die Marketingkampagne) Admin-Site), aber ich muss in der Lage sein, jedes Modul auf das gleiche Modell zu verweisen, da alle drei Komponenten in derselben Datenbank und auf denselben Geschäftsobjekten arbeiten.

Ich konnte jedoch keine Informationen darüber finden, wie dies in der Dokumentation zu tun ist. Kann jemand mit entweder einem Link auf, wie man dies tut, oder einigen einfachen Anweisungen, wie man es erreicht, helfen?

    
Noah Goodrich 03.11.2008, 18:09
quelle

5 Antworten

9

Was ich tue, ist, allgemeine Klassen in einem "Bibliotheks" -Verzeichnis außerhalb der Modulhierarchie zu behalten. Dann setze ich meine INCLUDE_PATH auf das Verzeichnis "models" des jeweiligen Moduls plus das gemeinsame Verzeichnis "library".

%Vor%

In meinem Bootstrap-Skript würde ich " application/library/ " zu INCLUDE_PATH hinzufügen. Dann würde ich in der Funktion init() jedes Controllers das Verzeichnis " models/ " des Moduls zum INCLUDE_PATH hinzufügen.

edit: Funktionen wie setControllerDirectory() und setModuleDirectory() fügen die entsprechenden Modellverzeichnisse nicht zu INCLUDE_PATH hinzu. Sie müssen dies auf jeden Fall selbst tun. Hier ist ein Beispiel dafür:

%Vor%

Sie könnten " library " zu Ihrem Pfad im Bootstrap hinzufügen, aber Sie können nicht das Verzeichnis " models " für das richtige Modul im Bootstrap hinzufügen, da das Modul vom Routing abhängig ist. Einige Leute machen das in der init() -Methode ihres Controllers, und einige Leute schreiben ein Plugin für den preDispatch-Hook des ActionControllers, um INCLUDE_PATH zu setzen.

    
Bill Karwin 03.11.2008, 18:22
quelle
3

Dies kann auch durch eine Namenskonvention erreicht werden, um Zend_Loader zu folgen. Bewahren Sie Ihre Modelldateien im Ordner models unter ihrem Modulordner auf. Benennen Sie sie als Module_Models_ModelName und speichern Sie sie unter dem Dateinamen ModelName.php im models-Ordner für dieses Modul. Stellen Sie sicher, dass sich der Anwendungsordner in Ihrem Include-Pfad befindet. Wenn Sie Zend_Loader zum automatischen Laden verwenden, können Sie die Modelle einfach anhand ihres Klassennamens referenzieren.

Dies hat den Vorteil, dass Ihr Modellcode mit dem eigentlichen Modul gruppiert wird. Dadurch bleibt das Modul in einer einzigen Ordnerstruktur enthalten, was die Kapselung unterstützt. Dies wird auch in Zukunft helfen, wenn Sie das Modul in ein anderes Projekt portieren müssen.

    
D-Rock 16.11.2008 04:14
quelle
1

Ich habe gerade diesen benutzerdefinierten Action Helper für das von Ihnen beschriebene Problem erstellt:

%Vor%

Also in deiner Bootstrap.php:

%Vor%

Und in jedem deiner Controller:

%Vor%

Dies ermöglicht Ihnen den Zugriff auf Modelle in jedem Controller über alle Module hinweg.

    
Jake McGraw 02.06.2009 23:19
quelle
0

Ich habe das gleiche Problem. Bills Antwort passt nicht zu mir - denn ich tendiere dazu, meine Module zu teilen, nicht durch "wer sie sieht", sondern durch "was sie machen". ZB kann ein "Forum-Modul" sowohl von Admin als auch von der Öffentlichkeit verwaltet werden. Ich versuche, Front-End-Module zu haben, wie Admin, Mitglieder, öffentliche - aber diese verwenden dann andere Module wie "Forum / validepost", "Forum / Show Benutzer persönliche Informationen". Wenn jemand herausfinden könnte, wie er ein Back-End-Modul vor der Öffentlichkeit schützt, wäre das praktisch. Ich denke, ACL mag der Schlüssel sein, aber es macht mich immer noch nervös, Zugriff von Objekten gesteuert zu haben, im Gegensatz zu 'Dateisystem / .htaccess' usw.

Um PHPoets Frage zu beantworten: (i) Pfade zu den Controller-Verzeichnissen des Moduls können durch Aufrufe an den Front-Controller festgelegt werden: Siehe zum Beispiel: "12.11.2. Angeben von Modul-Controller-Verzeichnissen" (Zend Framework Docs)

(ii) Pfade zu Ansichten können mit ViewRenderer (Controller Action Helper) eingestellt werden z.B. siehe: 'Beispiel 12.12. Auswahl eines anderen View-Skripts '(Zend Framework Docs)

Wenn Sie herumspielen, können Sie die Standardpfade zu Ansichten und Controllern ändern, wodurch Ihr Autoloader wieder normal läuft.

(Ich habe nicht in die Art und Weise, wie der Autoloader funktioniert, geschaut, aber es wäre sinnvoll, ein Mapper-System zu haben, um diese Art von Problem zu lösen.)

    
2 revsronny stalker 21.05.2009 04:02
quelle
0

%Vor%     
Dharmesh Vasani 03.10.2013 05:42
quelle