| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.controller.modular">
- <title>Eine konventionelle modulare Verzeichnis Struktur verwenden</title>
- <sect2 id="zend.controller.modular.introduction">
- <title>Einführung</title>
- <para>
- Eine konventionelle modulare Verzeichnisstruktur erlaubt es verschiedene
- <acronym>MVC</acronym> Anwendungen in selbst-enthaltene Einheiten zu teilen, und diese
- mit verschiedenen Front Controllern wiederzuverwenden. Um so eine Verzeichnisstruktur
- zu zeigen:
- </para>
- <programlisting language="txt"><![CDATA[
- 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/
- ]]></programlisting>
- <para>
- In diesem Paradigma arbeitet der Modulname als Prefix für den Controller den er enthält.
- Das obige Beispiel enthält drei Modul Controller,
- '<classname>Blog_IndexController</classname>',
- '<classname>News_IndexController</classname>', und
- '<classname>News_ListController</classname>'. Zwei gloale Controller,
- '<classname>IndexController</classname>' und '<classname>FooController</classname>'
- werden auch definiert; keiner von diesen ist in einem Namensraum. Diese
- Verzeichnisstruktur wird für die Beispiele in diesem Kapitel verwendet.
- </para>
- <note>
- <title>Keine Verwendung von Namensräumen im Standard Modul</title>
- <para>
- 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: '<classname>IndexController</classname>' und
- '<classname>FooController</classname>'. Ein Prefix für den Namensraum
- wird trotzdem in allen anderen Modulen verwendet.
- </para>
- </note>
- <para>
- Also, wie kann solch ein Verzeichnislayout mit den <acronym>MVC</acronym> Komponenten
- des Zend Frameworks implementiert werden?
- </para>
- </sect2>
- <sect2 id="zend.controller.modular.directories">
- <title>Verzeichnisse für Modul Controller spezifizieren</title>
- <para>
- 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
- <acronym>MVC</acronym> Serie, kann entweder ein Array oder ein String an
- <methodname>setControllerDirectory()</methodname>, oder ein Pfad an
- <methodname>addControllerDirectory()</methodname> übergeben werden. Wenn Module
- verwendet werden, müssen die Aufrufe dieser Methoden leicht geändert werden.
- </para>
- <para>
- Mit <methodname>setControllerDirectory()</methodname>, muß ein assoziatives Array
- übergeben und Schlüssel und Werte Paare von Modul Namen und Verzeichnis Pfaden
- übergeben werden. Der spezielle Schlüssel <property>default</property> 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
- <property>default</property> Schlüssel muß vorhanden sein. Als Beispiel:
- </para>
- <programlisting language="php"><![CDATA[
- $front->setControllerDirectory(array(
- 'default' => '/path/to/application/controllers',
- 'blog' => '/path/to/application/blog/controllers'
- ));
- ]]></programlisting>
- <para>
- <methodname>addControllerDirectory()</methodname> nimmt ein optionales zweites
- Argument. Wenn Module verwendet werden, kann der Modulname als zweites Argument
- übergeben werden; wenn nicht spezifiziert, wird der Pfad zum
- <emphasis>default</emphasis> Namensraum hinzugefügt. Als Beispiel:
- </para>
- <programlisting language="php"><![CDATA[
- $front->addControllerDirectory('/path/to/application/news/controllers',
- 'news');
- ]]></programlisting>
- <para>
- 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 <methodname>addModuleDirectory()</methodname>
- getan werden:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * Nehmen wir die folgende Verzeichnisstruktur an:
- * application/
- * modules/
- * default/
- * controllers/
- * foo/
- * controllers/
- * bar/
- * controllers/
- */
- $front->addModuleDirectory('/path/to/application/modules');
- ]]></programlisting>
- <para>
- Das obige Beispiel definiert die <emphasis>default</emphasis>,
- <emphasis>foo</emphasis>, und <emphasis>bar</emphasis> Module, die alle zum
- Unterverzeichnis <filename>controllers/</filename> zeigen und zu Ihrem betreffenden
- Modul.
- </para>
- <para>
- Das Unterverzeichnis für den Controller kann angepasst werden um diesen in eigenen
- Modulen mit <methodname>setModuleControllerDirectoryName()</methodname> verwenden:
- </para>
- <programlisting language="php"><![CDATA[
- /**
- * 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');
- ]]></programlisting>
- <note>
- <para>
- Man kann angeben das kein Controller Unterverzeichnis für die eigenen Module
- verwendet wird, indem ein leerer Wert an
- <methodname>setModuleControllerDirectoryName()</methodname> übergeben wird.
- </para>
- </note>
- </sect2>
- <sect2 id="zend.controller.modular.router">
- <title>Zu Modulen routen</title>
- <para>
- Die Standardroute in <classname>Zend_Controller_Router_Rewrite</classname> ist ein
- Objekt vom Typ <classname>Zend_Controller_Router_Route_Module</classname>. Diese Route
- erwartet eines der folgenden Routing Schemas:
- </para>
- <itemizedlist>
- <listitem><para><filename>:module/:controller/:action/*</filename></para></listitem>
- <listitem><para><filename>:controller/:action/*</filename></para></listitem>
- </itemizedlist>
- <para>
- 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.
- </para>
- </sect2>
- <sect2 id="zend.controller.modular.defaultcontroller">
- <title>Modul oder globaler Standard Controller</title>
- <para>
- Im Standardrouter wird der StandardController verwendet
- (<classname>IndexController</classname>, solange nicht anders angefragt), wenn kein
- Controller in der <acronym>URL</acronym> 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.
- </para>
- <para>
- Wenn immer auf den globalen Namensraum zurückgefallen werden soll, muß der
- <varname>$useDefaultControllerAlways</varname> im Front Controller gesetzt werden:
- </para>
- <programlisting language="php"><![CDATA[
- $front->setParam('useDefaultControllerAlways', true);
- ]]></programlisting>
- </sect2>
- </sect1>
|