Eine konventionelle modulare Verzeichnisstruktur erlaubt es verschiedene MVC Anwendungen in selbst-enthaltene Einheiten zu teilen, und diese mit verschiedenen Front Controllern wiederzuverwenden. Um so eine Verzeichnisstruktur zu zeigen:
docroot/ index.php application/ default/ controllers/ IndexController.php FooController.php models/ views/ scripts/ index/ foo/ helpers/ filters/ blog/ controllers/ IndexController.php models/ views/ scripts/ index/ helpers/ filters/ news/ controllers/ IndexController.php ListController.php models/ views/ scripts/ index/ list/ helpers/ filters/
In diesem Paradigma arbeitet der Modulname als Prefix für den Controller den er enthält.
Das obige Beispiel enthält drei Modul Controller,
'Blog_IndexController
',
'News_IndexController
', und
'News_ListController
'. Zwei gloale Controller,
'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 Controller, im Standardmodul, keinen Prefix für den
Namensraum benötigen. Deshalb benötigt der Controller, im obigen Beispiel, den
Prefix 'Default_' nicht -- sie werden einfach dispatched gemäß dem Namen des Basis
Controllers: '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?
Der erste Schritt um Module zu verwenden ist es, die Art der Spezifizierung der
Controller Verzeichnis Liste im Front Controller, 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 und Werte Paare von Modul Namen und Verzeichnis Pfaden
übergeben werden. Der spezielle Schlüssel default wird für globale
Controller 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:
$front->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:
$front->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:
/** * Nehmen wir die folgende Verzeichnisstruktur an: * application/ * modules/ * default/ * controllers/ * foo/ * controllers/ * bar/ * controllers/ */ $front->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 Controller kann angepasst werden um diesen in eigenen
Modulen mit setModuleControllerDirectoryName()
verwenden:
/** * Das Controller Unterverzeichnis ändern damit es 'con' ist * application/ * modules/ * default/ * con/ * foo/ * con/ * bar/ * con/ */ $front->setModuleControllerDirectoryName('con'); $front->addModuleDirectory('/path/to/application/modules');
Anmerkung
Man kann angeben das kein Controller Unterverzeichnis für die eigenen Module
verwendet wird, indem ein leerer Wert an
setModuleControllerDirectoryName()
übergeben wird.
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 Controller 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 Controller Verzeichnis Array existiert, das dem Front Controller und Dispatcher übergeben wird.
Im Standardrouter wird der StandardController verwendet
(IndexController
, solange nicht anders angefragt), wenn kein
Controller in der URL spezifiziert wurde. Bei modularen Controllern
wird der Dispatcher zuerst für diesen Standardcontroller im Modulpfad nachsehen, wenn
ein Modul aber kein Controller 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 Controller gesetzt werden:
$front->setParam('useDefaultControllerAlways', true);