|
|
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:
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 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.
Note: 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?
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:
$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 Kontroller kann angepasst werden um diesen in eigenen Modulen mit
setModuleControllerDirectoryName() verwenden:
/**
* Das Kontroller Unterverzeichnis ändern damit es 'con' ist
* application/
* modules/
* default/
* con/
* foo/
* con/
* bar/
* con/
*/
$front->setModuleControllerDirectoryName('con');
$front->addModuleDirectory('/path/to/application/modules');
Note:
Man kann angeben das kein Kontroller 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 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.
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 'default'
globalen Namensraum gefunden wird.
Wenn immer auf den globalen Namensraum zurückgefallen werden soll, muß der
useDefaultControllerAlways im Front Kontroller gesetzt werden:
$front->setParam('useDefaultControllerAlways', true);
|
|
Copyright © 2005-2011 Zend Technologies Inc (compiled by mikaelkael with ZFDocumentor - SVN 12872).

