Eine konventionelle modulare Verzeichnis Struktur verwenden
Einführung
Eine konventionelle modulare Verzeichnisstruktur erlaubt es verschiedene MVC Anwendungen
in selbst-enthaltene Einheiten zu teilen, und diese mit verschiedenen Front Kontrollern
wiederzuverwenden. Um so eine Verzeichnisstruktur zu zeigen:
In diesem Paradigma arbeitet der Modulname als Prefix für den Kontroller den er enthält.
Das obige Beispiel enthält drei Modul Kontroller, 'Blog_IndexController',
'News_IndexController', und 'News_ListController'. Zwei gloale Kontroller,
'IndexController' und 'FooController' werden auch definiert; keiner von diesen ist in
einem Namensraum. Diese Verzeichnisstruktur wird für die Beispiele in diesem Kapitel
verwendet.
Keine Verwendung von Namensräumen im Standard Modul
Es ist zu beachten das Kontroller, im Standardmodul, keinen Prefix für den
Namensraum benötigen. Deshalb benötigt der Kontroller, im obigen Beispiel, den
Prefix 'Default_' nicht -- sie werden einfach dispatched gemäß dem Namen des Basis
Kontrollers: 'IndexController' und 'FooController'. Ein Prefix für den Namensraum
wird trotzdem in allen anderen Modulen verwendet.
Also, wie kann solch ein Verzeichnislayout mit den MVC Komponenten des Zend Frameworks
implementiert werden?
Verzeichnisse für Modul Kontroller spezifizieren
Der erste Schritt um Module zu verwenden ist es, die Art der Spezifizierung der
Kontroller Verzeichnis Liste im Front Kontroller, zu Ändern. In der grundsätzlichen MVC
Serie, kann entweder ein Array oder ein String an
setControllerDirectory(), oder ein Pfad an
addControllerDirectory() übergeben werden. Wenn Module
verwendet werden, müssen die Aufrufe dieser Methoden leicht geändert werden.
Mit setControllerDirectory(), muß ein assoziatives Array
übergeben und Schlüssel/Werte Paare von Modul Namen/Verzeichnis Pfaden übergeben
werden. Der spezielle Schlüssel default wird für globale Kontroller
verwenden (diejenigen die keinen Modul Namensraum benötigen). Alle Einträge sollten
einen String Schlüssel enthalten der zu einem einzelnen Pfad zeigt, und der
default Schlüssel muß vorhanden sein. Als Beispiel:
setControllerDirectory(array(
'default' => '/path/to/application/controllers',
'blog' => '/path/to/application/blog/controllers'
));
]]>
addControllerDirectory() nimmt ein optionales zweites
Argument. Wenn Module verwendet werden, kann der Modulname als zweites Argument
übergeben werden; wenn nicht spezifiziert, wird der Pfad zum default
Namensraum hinzugefügt. Als Beispiel:
addControllerDirectory('/path/to/application/news/controllers',
'news');
]]>
Und das beste zum Schluß. Der einfachste Weg um Modul Verzeichnisse zu spezifizieren
ist es en masse zu machen, mit allen Modulen in einem gemeinsamen Verzeichnis und die
gleiche Struktur verwendend. Das kann mit addModuleDirectory()
getan werden:
addModuleDirectory('/path/to/application/modules');
]]>
Das obige Beispiel definiert die default, foo, und
bar Module, die alle zum Unterverzeichnis controllers zeigen
und zu Ihrem betreffenden Modul.
Das Unterverzeichnis für den Kontroller kann angepasst werden um diesen in eigenen
Modulen mit setModuleControllerDirectoryName() verwenden:
setModuleControllerDirectoryName('con');
$front->addModuleDirectory('/path/to/application/modules');
]]>
Man kann angeben das kein Kontroller Unterverzeichnis für die eigenen Module verwendet
wird, indem ein leerer Wert an
setModuleControllerDirectoryName() übergeben wird.
Zu Modulen routen
Die Standardroute in Zend_Controller_Router_Rewrite ist ein
Objekt vom Typ Zend_Controller_Router_Route_Module. Diese Route
erwartet eines der folgenden Routing Schemas:
:module/:controller/:action/*
:controller/:action/*
In anderen Worten, wird jeder Kontroller und jede Aktion durch sich selbst entsprechen
oder mit einem vorangestellten Modul. Diese Regeln für die Entsprechung spezifizieren,
das ein Modul nur dann entspricht, wenn ein Schlüssel mit dem gleichen Namen im
Kontroller Verzeichnis Array existiert, das dem Front Kontroller und Dispatcher
übergeben wird.
Modul oder globaler Standard Kontroller
Im Standardrouter wird der Standardkontroller verwendet
(IndexController, solange nicht anders angefragt), wenn kein
Kontroller in der URL spezifiziert wurde. Bei modularen Kontrollern wird der Dispatcher
zuerst für diesen Standardkontroller im Modulpfad nachsehen, wenn ein Modul aber kein
Kontroller spezifiziert wurde, und fällt dann auf den Standardcontroller zurück, der im
globalen 'default' Namensraum gefunden wird.
Wenn immer auf den globalen Namensraum zurückgefallen werden soll, muß der
$useDefaultControllerAlways im Front Kontroller gesetzt werden:
setParam('useDefaultControllerAlways', true);
]]>