<commit_before><sect1 id="zend.controller.overview">
	<title>Überblick</title>

	<sect2 id="zend.controller.overview.introduction">
		<title>Einführung</title>
		<para>
			<code>Zend_Controller</code> stellt das Fundament für den Aufbau einer Website auf 
			Basis des Model-View-Controller	(MVC) Entwurfsmusters bereit.
		</para>

		<para>
			Das <code>Zend_Controller</code> System wurde leichtgewichtig, modular und erweiterbar 
			gestaltet. Die Form ist einfach, um den Benutzern viel Flexibilität und Freiheiten zu 
			ermöglichen. Dennoch bietet es ausreichend Struktur, damit Systeme, die auf den 
			<code>Zend_Controller</code> aufbauen, gemeinsame Konventionen befolgen und einen 
			ähnlichen Code Aufbau verwenden. 
		</para>

		<para>
		    Der <code>Zend_Controller</code> Ablauf wurde durch verschiedene Komponenten 
		    implementiert. Während es für die Benutzung des Systems nicht notwendig ist, den 
		    kompletten Unterbau all dieser Komponenten zu verstehen, ist es hilfreich, über 
		    ausreichend Kenntnisse des Ablaufes zu verfügen. 

			<itemizedlist>
				<listitem>
					<para>
						<code>Zend_Controller_Front</code>
						steuert den gesamten Ablauf des <code>Zend_Controller</code> Systems. Es 
						ist eine Interpretation des FrontController Entwurfsmusters. 
						<code>Zend_Controller_Front</code> verarbeitet alle Anfragen, die der 
						Server erhält, und ist letztendlich dafür verantwortlich, die Anfragen 
						an die ActionController (<code>Zend_Controller_Action</code>) zu deligieren.
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Router</code> ist der Router. Routing ist der Prozess
						der Übernahme und Zerteilung einer URI, um zu ermitteln, welcher 
						Controller und welche Aktion des Controllers die Anfrage erhalten soll.
						Die Definition des Controllers, der Aktion sowie weiterer Parameter wird in 
						einem Objekt mit Namen <code>Zend_Controller_Dispatcher_Token</code>
						gekapselt. Dieser wird dann vom <code>Zend_Controller_Dispatcher</code> 
						verarbeitet. Das Routing geschieht nur einmal: wenn zu Beginn die Anfrage 
						erhalten wird und bevor der erste Controller aufgerufen wird. 
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Dispatcher</code> ist der Dispatcher. Dispatching 
						ist der Prozess, bei dem der <code>Zend_Controller_Dispatcher_Token</code>
						übernommen, die entsprechende Controller Datei gefunden, die Controller 
						Klasse (muß <code>Zend_Controller_Action</code> implementieren) in dieser 
						Datei instanziiert und letztendlich die Methode für die Aktion in dem 
						Controller Objekt aufgerufen wird. Anders als das Routing, das immer nur 
						einmal vorkommt, erfolgt das Dispatching in einer Schleife. 
						<code>Zend_Controller_Dispatcher</code> wird wiederholt von 
						<code>Zend_Controller_Front</code> aufgerufen, bis alle Aktionen 
						nacheinander ausgeführt worden sind. 
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Action</code> ist die elementare Controller 
						Komponente. Jeder Controller ist eine einzelne Klasse, welche die  
						<code>Zend_Controller_Action</code> Klasse erweitert und Methoden für die
						Aktionen enthält. 
					</para>
				</listitem>
			</itemizedlist>

			Der Ablauf vom <code>Zend_Controller</code> ist relativ einfach. Eine Anfrage wird vom
			<code>Zend_Controller_Front</code> empfangen, der wiederum <code>Zend_Controller_Router</code>
			aufruft, um zu ermitteln, welcher Controller (und welche Aktion in dem Controller) 
			ausgeführt werden soll. <code>Zend_Controller_Router</code> zerteilt die URI in ein 
			<code>Zend_Controller_Dispatcher_Token</code> Objekt, welches angibt, was 
			auszuführen ist. <code>Zend_Controller_Front</code> durchläuft dann eine 
			Dispatcher Schleife. Er ruft <code>Zend_Controller_Dispatcher</code> auf und übergibt 
			den Token, um den aktuellen Controller und die aktuelle Aktion auszuführen. Wenn der
			Controller fertig ist, wird die Kontrolle wieder an <code>Zend_Controller_Front</code>
			übergeben. Wenn der erste Controller durch die Rückgabe eines neuen Tokens angezeigt 
			hat, dass ein weiterer Controller ausgeführt werden soll, wird der Durchlauf 
			fortgesetzt und ein weiterer Dispatcher Prozess wird durchlaufen. Andernfalls endet 
			der Prozess.  
		</para>
	</sect2>

	<sect2 id="zend.controller.overview.routing-process">
		<title>Routing Prozess</title>

		<para>
		    Bevor dein erster Controller erstellt werden kann, musst du die Funkktionsweise des 
			Routing Prozesses verstehen, wie er in <code>Zend_Controller_Router</code> implementiert 
			worden ist. Denke daran, dass der Ablauf unterteilt ist in das Routing, das nur einmal 
			ausgeführt wird, und das Dispatching, welches danach in einer Schleife durchlaufen wird.
		</para>

		<para>
		    <code>Zend_Controller_Front</code> ruft <code>Zend_Controller_Router</code> auf, um die
		    URI auf einen Controller (und eine Aktion in diesem Controller) abzubilden. 
		    <code>Zend_Controller_Router</code> nimmt die URI und zerteilt sie in ein 
		    <code>Zend_Controller_Dispatcher_Token</code> Objekt, welches an den Dispatcher
		    (<code>Zend_Controller_Dispatcher</code>) übergeben wird. 
		</para>

		<para>
		    Der Router verwendet eine sehr einfache Zuordnung, um den Namen des Controllers und
		    den Namen der Aktion innerhalb dieses Controllers zu ermitteln.
		</para>
			
			<programlisting role="php"><![CDATA[
http://framework.zend.com/controller/action/]]>
			</programlisting>

		<para>
			Beachte im obigen Beispiel, dass das erste Segment immer den Namen des Controllers und 
			das zweite Segment immer den Name der Aktion enthält. 
		</para>

		<para>
		    Optional können in der URI auch Parameter definiert werden, die an den Controller
		    übergeben werden. Diese haben die Form eines Schlüssel/Wert Paares:
		</para>
			
			<programlisting role="php"><![CDATA[
http://framework.zend.com/controller/action/key1/value1/]]>
			</programlisting>

		<para>
		    Wenn im <code>/controller/</code> Teil der URI nichts enthalten ist, wird dieser Teil zu
		    "<code>index</code>". Wenn im <code>/action/</code> Teil der URI nichts enthalten ist,
		    wird dieser Teil ebenfalls zu <code>index</code>. Diese Beispiele erläutern dies:
		</para>

				<programlisting role="php"><![CDATA[
http://framework.zend.com/roadmap/future/
Controller: roadmap
Action    : future

http://framework.zend.com/roadmap/
Controller: roadmap
Action    : index

http://framework.zend.com/
Controller: index
Action    : index]]>
				</programlisting>

			<note>
			    Wir entwickeln momentan einen neuen Router mit einer Engine für das URI Rewriting,
			    welche flexiblere Möglichkeiten bietet als die aktuell im Router vorhandene. Diese 
			    wird in naher Zukunft in einer Vorschauversion enthalten sein. 
			</note>

			<para>
			    Der Name des Controllers und der Aktion innerhalb dieses Controllers sowie weitere
			    optionale Parameter werden in einem <code>Zend_Controller_Dispatcher_Token</code> 
			    gekapselt. Dieser Token wird an <code>Zend_Controller_Front</code> zurückgegeben, 
			    der in die Dispatcher Schleife übergeht. Einmal in der Dispatcher Schleife wird der 
			    Token an den <code>Zend_Controller_Dispatcher</code> übergeben.
			</para>
	</sect2>

	<sect2 id="zend.controller.overview.dispatch-token">
		<title>Dispatcher Token</title>

		<para>
			Der Dispatcher Token ist ein einfaches Objekt, das zwischen <code>Zend_Controller_Front</code>
			und den Klassen übergeben wird, welche die Router und Dispatcher Interfaces  
			implementieren. Es enthalt eine Definition des Controllers, eine Aktion und Parameter, 
			die an die Aktion übergeben werden.
		</para>

		<itemizedlist>
			<listitem><para>
				Auf den Names des Controllers wird über <code>getControllerName()</code> und 
				<code>setControllerName()</code> zurückgegriffen. 
			</para></listitem>
			<listitem><para>
				Auf den Namen der Aktion innerhalb des Controllers wird über <commit_msg>german Docu Zend_Controller :  - fixed docu dtd valid problems<commit_after><sect1 id="zend.controller.overview">
	<title>Überblick</title>

	<sect2 id="zend.controller.overview.introduction">
		<title>Einführung</title>
		<para>
			<code>Zend_Controller</code> stellt das Fundament für den Aufbau einer Website auf 
			Basis des Model-View-Controller	(MVC) Entwurfsmusters bereit.
		</para>

		<para>
			Das <code>Zend_Controller</code> System wurde leichtgewichtig, modular und erweiterbar 
			gestaltet. Die Form ist einfach, um den Benutzern viel Flexibilität und Freiheiten zu 
			ermöglichen. Dennoch bietet es ausreichend Struktur, damit Systeme, die auf den 
			<code>Zend_Controller</code> aufbauen, gemeinsame Konventionen befolgen und einen 
			ähnlichen Code Aufbau verwenden. 
		</para>

		<para>
		    Der <code>Zend_Controller</code> Ablauf wurde durch verschiedene Komponenten 
		    implementiert. Während es für die Benutzung des Systems nicht notwendig ist, den 
		    kompletten Unterbau all dieser Komponenten zu verstehen, ist es hilfreich, über 
		    ausreichend Kenntnisse des Ablaufes zu verfügen. 

			<itemizedlist>
				<listitem>
					<para>
						<code>Zend_Controller_Front</code>
						steuert den gesamten Ablauf des <code>Zend_Controller</code> Systems. Es 
						ist eine Interpretation des FrontController Entwurfsmusters. 
						<code>Zend_Controller_Front</code> verarbeitet alle Anfragen, die der 
						Server erhält, und ist letztendlich dafür verantwortlich, die Anfragen 
						an die ActionController (<code>Zend_Controller_Action</code>) zu deligieren.
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Router</code> ist der Router. Routing ist der Prozess
						der Übernahme und Zerteilung einer URI, um zu ermitteln, welcher 
						Controller und welche Aktion des Controllers die Anfrage erhalten soll.
						Die Definition des Controllers, der Aktion sowie weiterer Parameter wird in 
						einem Objekt mit Namen <code>Zend_Controller_Dispatcher_Token</code>
						gekapselt. Dieser wird dann vom <code>Zend_Controller_Dispatcher</code> 
						verarbeitet. Das Routing geschieht nur einmal: wenn zu Beginn die Anfrage 
						erhalten wird und bevor der erste Controller aufgerufen wird. 
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Dispatcher</code> ist der Dispatcher. Dispatching 
						ist der Prozess, bei dem der <code>Zend_Controller_Dispatcher_Token</code>
						übernommen, die entsprechende Controller Datei gefunden, die Controller 
						Klasse (muß <code>Zend_Controller_Action</code> implementieren) in dieser 
						Datei instanziiert und letztendlich die Methode für die Aktion in dem 
						Controller Objekt aufgerufen wird. Anders als das Routing, das immer nur 
						einmal vorkommt, erfolgt das Dispatching in einer Schleife. 
						<code>Zend_Controller_Dispatcher</code> wird wiederholt von 
						<code>Zend_Controller_Front</code> aufgerufen, bis alle Aktionen 
						nacheinander ausgeführt worden sind. 
					</para>
				</listitem>

				<listitem>
					<para>
						<code>Zend_Controller_Action</code> ist die elementare Controller 
						Komponente. Jeder Controller ist eine einzelne Klasse, welche die  
						<code>Zend_Controller_Action</code> Klasse erweitert und Methoden für die
						Aktionen enthält. 
					</para>
				</listitem>
			</itemizedlist>

			Der Ablauf vom <code>Zend_Controller</code> ist relativ einfach. Eine Anfrage wird vom
			<code>Zend_Controller_Front</code> empfangen, der wiederum <code>Zend_Controller_Router</code>
			aufruft, um zu ermitteln, welcher Controller (und welche Aktion in dem Controller) 
			ausgeführt werden soll. <code>Zend_Controller_Router</code> zerteilt die URI in ein 
			<code>Zend_Controller_Dispatcher_Token</code> Objekt, welches angibt, was 
			auszuführen ist. <code>Zend_Controller_Front</code> durchläuft dann eine 
			Dispatcher Schleife. Er ruft <code>Zend_Controller_Dispatcher</code> auf und übergibt 
			den Token, um den aktuellen Controller und die aktuelle Aktion auszuführen. Wenn der
			Controller fertig ist, wird die Kontrolle wieder an <code>Zend_Controller_Front</code>
			übergeben. Wenn der erste Controller durch die Rückgabe eines neuen Tokens angezeigt 
			hat, dass ein weiterer Controller ausgeführt werden soll, wird der Durchlauf 
			fortgesetzt und ein weiterer Dispatcher Prozess wird durchlaufen. Andernfalls endet 
			der Prozess.  
		</para>
	</sect2>

	<sect2 id="zend.controller.overview.routing-process">
		<title>Routing Prozess</title>

		<para>
		    Bevor dein erster Controller erstellt werden kann, musst du die Funkktionsweise des 
			Routing Prozesses verstehen, wie er in <code>Zend_Controller_Router</code> implementiert 
			worden ist. Denke daran, dass der Ablauf unterteilt ist in das Routing, das nur einmal 
			ausgeführt wird, und das Dispatching, welches danach in einer Schleife durchlaufen wird.
		</para>

		<para>
		    <code>Zend_Controller_Front</code> ruft <code>Zend_Controller_Router</code> auf, um die
		    URI auf einen Controller (und eine Aktion in diesem Controller) abzubilden. 
		    <code>Zend_Controller_Router</code> nimmt die URI und zerteilt sie in ein 
		    <code>Zend_Controller_Dispatcher_Token</code> Objekt, welches an den Dispatcher
		    (<code>Zend_Controller_Dispatcher</code>) übergeben wird. 
		</para>

		<para>
		    Der Router verwendet eine sehr einfache Zuordnung, um den Namen des Controllers und
		    den Namen der Aktion innerhalb dieses Controllers zu ermitteln.
		</para>
			
			<programlisting role="php"><![CDATA[
http://framework.zend.com/controller/action/]]>
			</programlisting>

		<para>
			Beachte im obigen Beispiel, dass das erste Segment immer den Namen des Controllers und 
			das zweite Segment immer den Name der Aktion enthält. 
		</para>

		<para>
		    Optional können in der URI auch Parameter definiert werden, die an den Controller
		    übergeben werden. Diese haben die Form eines Schlüssel/Wert Paares:
		</para>
			
			<programlisting role="php"><![CDATA[
http://framework.zend.com/controller/action/key1/value1/]]>
			</programlisting>

		<para>
		    Wenn im <code>/controller/</code> Teil der URI nichts enthalten ist, wird dieser Teil zu
		    "<code>index</code>". Wenn im <code>/action/</code> Teil der URI nichts enthalten ist,
		    wird dieser Teil ebenfalls zu <code>index</code>. Diese Beispiele erläutern dies:
		</para>

        <programlisting role="php"><![CDATA[
http://framework.zend.com/roadmap/future/
Controller: roadmap
Action    : future

http://framework.zend.com/roadmap/
Controller: roadmap
Action    : index

http://framework.zend.com/
Controller: index
Action    : index]]>
        </programlisting>

		<note>
		    <title>New rewrite engine</title>
		    <para>
			    Wir entwickeln momentan einen neuen Router mit einer Engine für das URI Rewriting,
			    welche flexiblere Möglichkeiten bietet als die aktuell im Router vorhandene. Diese 
			    wird in naher Zukunft in einer Vorschauversion enthalten sein. 
			</para>
		</note>

			<para>
			    Der Name des Controllers und der Aktion innerhalb dieses Controllers sowie weitere
			    optionale Parameter werden in einem <code>Zend_Controller_Dispatcher_Token</code> 
			    gekapselt. Dieser Token wird an <code>Zend_Controller_Front</code> zurückgegeben, 
			    der in die Dispatcher Schleife übergeht. Einmal in der Dispatcher Schleife wird der 
			    Token an den <code>Zend_Controller_Dispatcher</code> übergeben.
			</para>
	</sect2>

	<sect2 id="zend.controller.overview.dispatch-token">
		<title>Dispatcher Token</title>

		<para>
			Der Dispatcher Token ist ein einfaches Objekt, das zwischen <code>Zend_Controller_Front</code>
			und den Klassen übergeben wird, welche die Router und Dispatcher Interfaces  
			implementieren. Es enthalt eine Definition des Controllers, eine Aktion und Parameter, 
			die an die Aktion übergeben werden.
		</para>

		<itemizedlist>
			<listitem><para>
				Auf den Names des Controllers wird über <code>getControllerName()</code> und 
				<code>setControllerName()</code> zurückgegriffen. 
			</para></listitem>
			<listitem><para>
				Auf den Namen der Aktion innerhalb des Controllers wird über 
{'fraction_non_alphanumeric': 0.07448040470530871, 'fraction_numerical': 0.0009751935149631255, 'mean_word_length': 3.811730205278592, 'pattern_counts': {'":': 0, '<': 319, '<?xml version=': 0, '>': 319, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '981289', 'n_tokens_mistral': 5983, 'n_tokens_neox': 5296, 'n_words': 1634}