<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zietlow.net &#187; MVC</title>
	<atom:link href="http://www.zietlow.net/tag/mvc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zietlow.net</link>
	<description>Web Entwicklung, Selbstmanagement und einiges aus meiner (subjektiven) Welt</description>
	<lastBuildDate>Thu, 11 Jun 2009 09:27:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>MVC (Model–View–Controller) im Zend Framework</title>
		<link>http://www.zietlow.net/zend-framework/mvc-model%e2%80%93view%e2%80%93controller-im-zend-framework/16/</link>
		<comments>http://www.zietlow.net/zend-framework/mvc-model%e2%80%93view%e2%80%93controller-im-zend-framework/16/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 20:00:18 +0000</pubDate>
		<dc:creator>Francois</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.zietlow.net/zend-framework/mvc-model%e2%80%93view%e2%80%93controller-im-zend-framework/16/</guid>
		<description><![CDATA[Ziel ist es das MVC Prinzip und dessen Umsetzung im Zend Framework zu verstehen. Damit wird die Grundlage für die Entwicklung im Zend Framework gesetzt &#8211; Unabhängig der Version. Sinn eines Software-Architekturmusters Software gleicht an vielen Stellen dem Hausbau. Ab und an leider auch dem Städtebau&#8230; Wenn wir – als Programmierer (Maurer) oder Software-Architekt / [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ziel ist es das MVC Prinzip und dessen Umsetzung im Zend Framework zu verstehen.<br />
Damit wird die Grundlage für die Entwicklung im Zend Framework gesetzt &#8211; Unabhängig der Version.<span id="more-16"></span></p>
<hr />
<h2>Sinn eines Software-Architekturmusters</h2>
<p>Software gleicht an vielen Stellen dem Hausbau. Ab und an leider auch dem Städtebau&#8230;<br />
Wenn wir – als Programmierer (Maurer) oder Software-Architekt / Entwickler (Architekt) – eine Software „bauen“ möchten, sollten wir uns am Anfang einen Plan dieser Software machen</p>
<p>Software-Architekturmuster stellen uns für den Plan und für den Bau ein Grundgerüst zur Verfügung, nach dem wir die Software logisch aufbauen können.<br />
Sie sind aber keine Garantie für eine stabile und sichere Anwendung, da es sich um ein logisches Konzept handelt.</p>
<p>Vorteile und Ziele eines Architekturmusters:</p>
<ul>
<li>Architekturmuster schaffen Ordnung</li>
<li>Die Kommunikation wird vereinfacht</li>
<li>Einmal erlernt, ist der Aufbau der Software logisch</li>
<li>Leichte Erweiterbarkeit</li>
<li>Leichte Änderbarkeit</li>
<li>Möglichkeit zur Wiederverwendung von Code</li>
</ul>
<p>Nach Architekturmuster können Software-Anwendungen entwickelt werden.<br />
Oft kommt hierfür ein Framework zum Einsatz, welches nach dem Architekturmuster entwickelt wurde und die Umsetzung und Einhaltung dieses Architekturmusters vereinfacht.</p>
<p>Eines der meist verwendeten Software-Architekturmuster ist das MVC (Model-View-Controler),<br />
welches näher beschrieben werden soll.</p>
<h2>Grundaufbau des MVC</h2>
<p>Das MVC Architekturmuster gibt drei Trennungen vor:</p>
<ul>
<li><strong>M</strong>odel (Modell)</li>
<li><strong>V</strong>iew (Präsentation)</li>
<li><strong>C</strong>ontroller (Steuerung)</li>
</ul>
<h3>Model (Modell)</h3>
<p>Zuständigkeit des Models:</p>
<ul>
<li>Daten<br />
Beispiel: aus einer Datenbank werden Daten abgefragt.</li>
<li>Geschäftslogik<br />
Beispiel: „Wenn Produkt MwSt-Pflichtig, dann schlage 19% drauf.“</li>
</ul>
<h3>View (Präsentation)</h3>
<p>Zuständigkeit der View:</p>
<ul>
<li>Anzeige von Daten (aus dem Model)</li>
<li>Anzeigelogik<br />
Beispiel: „Wenn diese Kennzahl so, dann zeige Schaltfläche X an.„</li>
<li>Benutzerinteraktion bereitstellen<br />
Schaltflächen, Textfelder etc.</li>
</ul>
<h3>Controller (Steuerung)</h3>
<p>Zuständigkeit des Controllers:</p>
<ul>
<li>Verwaltet Views</li>
<li>Steuert wann welche View angezeigt wird</li>
<li>Verwaltet Benutzereingaben<br />
Gibt diese an die View weiter</li>
</ul>
<h3>Zusammenspiel in klassischen Fenster Applikationen</h3>
<p>In klassischen Fenster-Applikationen bilden Controller und View die Benutzeroberfläche,<br />
da der Controller die Eingaben entgegen nimmt, diese ans Fenster (View) weiterleitet.<br />
Die View kennt dabei sein Model und leitet die Eingabe zur Bearbeitung weiter.<br />
Grund hierfür ist, dass die Entwicklung oft hinter einem optischen Objekt (z.B. einer Schaltfläche)  in einer Methode (z.B. „Klick auf die Schaltfläche“) steckt.<br />
Diese Methode kommuniziert dann mit dem Model.</p>
<p>Das ergibt oft folgende Kommunikation:</p>
<p>Controller &lt;-&gt; View &lt;-&gt; Model</p>
<h3>Zusammenspiel in Web-Anwendungen / im Zend Framework</h3>
<p>In Web-Anwendungen steckt hinter einer Schaltfläche erst einmal noch keine direkte Logik.<br />
Das drücken dieser Schaltfläche wird erst an den Server übertragen, der wiederum,<br />
muss hierfür eine passende Aktion ausführen und sendet ein Ergebnis zurück.</p>
<p>Im Zend Framework ergibt sich daraus folgende Kommunikation:</p>
<p>Model -&gt; Controller &lt;-&gt; View</p>
<p>Die View greift &#8211; idealerweise &#8211; auf die Daten aus dem Model nur zu,<br />
wenn der Controller diese übergeben hat,<br />
dadurch entsteht keine direkte Kommunikation zwischen Model und View.</p>
<p>Hinweis: Es gibt mittlerweile Web-Entwicklungen die das den klassischen Fenster Applikationen gleich machen (Microsoft ASP .NET und in Anlehnung daran das PHP Framework Prado).<br />
Diese lassen sich – fasst – so wie Fenster-Anwendungen entwickeln und setzen das intern wieder so um, dass das auch im Web funktioniert.</p>
<h2>Voraussetzung: OOP</h2>
<p>Nachfolgend geht es um die konkrete MVC Umsetzung im Zend Framework.<br />
Hierfür sollte OOP (Objektorientierte Programmierung) und alle damit verwendeten Begriffe kein Fremdwort sein. Als Auffrischung empfehle ich den <a href="http://de.wikipedia.org/wiki/Objektorientierte_Programmierung">Wikipedia Eintrag zu OOP</a>.</p>
<p><strong>Für Diejenigen die sich mit OOP noch gar nicht auskennen:</strong><br />
Generell ist es sinnvoll / notwendig sich das OOP Prinzip an zueignen, wenn man das MVC Prinzip nicht nur konzeptionell sondern auch die technische Umsetzung verstehen möchte.<br />
Die Umsetzung von MVC basiert meistens immer auf dem OOP Konzept.</p>
<p><strong>Für Diejenigen die OOP kennen</strong>, kann ich nur empfehlen sich mit Design Patterns (Entwurfsmustern) zu beschäftigen. Es erleichtert das Zend Framework zu verstehen und ist natürlich auch für eigene Entwicklungen extrem nützlich – wenn man auf OOP setzt&#8230;</p>
<h2>MVC im Zend Framework</h2>
<p>Das Zend Framework ist nach dem MVC Architekturmuster aufgebaut.<br />
Die MVC Theorie sollte klar sein, ab hier wird jetzt die technische Umsetzung im Zend Framework beschrieben.</p>
<h3>Model</h3>
<p>Derzeit – und ich denke auch in Zukunft – gibt es keine generelle Komponente für das Model.<br />
Wir wissen, dass das Model die Geschäftslogik und die Daten beinhaltet.</p>
<p>Bei dem Model handelt es sich also um Klassen, die Daten aus Datenbanken, Web Services, Feeds, Konfigurationsdateien, Dateisystem und anderen Quellen „her holen“ und diese – je nach Geschäftslogik – verarbeiten.<br />
Das ist meist so individuell das es keinen Sinn macht das Model vorzuschreiben.</p>
<p>Doch das Zend Framework bietet für die verschiedensten Zugriffe Unterstützung an, zum Beispiel:</p>
<ul>
<li>Zend_Db: auf Datenbanken zuzugreifen</li>
<li>Zend_Service_*: Entsprechenden Webservices aufrufen</li>
<li>Zend_Config: Konfigurationsdateien auszulesen</li>
<li>&#8230;</li>
</ul>
<h3>View</h3>
<p>Standardmäßig gibt es die Klasse Zend_View, die als Template Engine PHP verwendet und vom Anfang an aktiv ist.<br />
Eine eigene View kann erstellt werden, Sie muss lediglich das Interface Zend_View_Interface implementieren.<br />
Ich gehe jedoch bei der kommenden Beschreibung von der Zend_View und deren Standradkonfiguration aus.</p>
<p>Die Zend_View hat die Aufgabe die View Scripts zu verarbeiteten, die für uns den View Part im MVC Modell darstellen.</p>
<h4>View Scripts</h4>
<p>Die eigentliche Anzeige und die Anzeigelogik befindet sich in den View Scripts.</p>
<ul>
<li>Befinden sich im Verzeichnis:<br />
„application/views/scripts“</li>
<li>Endung „.phtml“, deutet an das sich darin PHP und HTML 	befindet.</li>
<li>Ausgabe von Variablen: &lt;?=$this-&gt;content ?&gt;</li>
<li>View Helpers:
<ul>
<li>Erweitern die Funktionalität von Zend_View</li>
<li>Aufruf wie eine Methode von Zend_View<br />
&lt;?= 		$this-&gt;formText(&#8216;username&#8217;) ?&gt;</li>
<li>Eigene View Helper könnten geschrieben werden</li>
<li>Anwendungsmöglichkeiten:
<ul>
<li>Datenabruf (z.B. Hinzufügen eines del.icio.us Feeds)</li>
<li>Umändern der Ausgabe (z.B. Wikitext in HTML 			konvertieren)</li>
<li>Anzeigelogik (z.B. Anzeigen des Logins, wenn nicht 			angemeldet)</li>
<li>Wiederverwendbare Ausgaben (z.B. eine Suchbox)</li>
</ul>
</li>
</ul>
</li>
<li>Filter
<ul>
<li>Kann den Inhalt vor der Ausgabe filtern</li>
<li>Es können eigene Filter geschrieben werden</li>
<li>Anwendungsmöglichkeiten:
<ul>
<li>Inhalt von HTML zu PDF umwandeln</li>
<li>Inhalt von HTML zu JSON umwandeln</li>
<li>HTML über Tidy laufen lassen</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Controller</h3>
<p>Im Zend Framework ist das der Action Controller:</p>
<ul>
<li>Verwaltet die Anfrage</li>
<li>besteht aus mehreren Actions</li>
<li>Aktion
<ul>
<li> öffentliche Mehtode</li>
<li> Aufbau des Namens: [Name]Action</li>
<li>„indexAction“ wird aufgerufen 		falls keine Action angegeben ist</li>
<li>„init“ wird bei der 		Initialisierung aufgerufen</li>
<li>definiert welches View Skript 		ausgegeben werden soll<br />
(Std: [Controllername]/[Actionname] im 		View Script Verzeichnis)</li>
<li>Kommuniziert mit dem Model</li>
<li>leitet Daten – z.B. aus dem 		Model oder Request – an die View</li>
<li>Action Helper,
<ul>
<li> Wiederverwendbare 			Funktionalitäten</li>
</ul>
<ul>
<li>Aufruf aus allen Action 			Controllern heraus</li>
</ul>
<ul>
<li>Automatische Prozesse die in den 			Action Controllern ausgeführt werden<br />
(über die init 			oder die preDispatch Methode)</li>
</ul>
<ul>
<li>Initialisierung bei der 			Benutzung (on demand) oder nach Registrierung</li>
</ul>
<ul>
<li>Funktionalitäten die man 			später auslagern möchte</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3>Zusammenspiel</h3>
<p>Das grundlegende Zusammenspiel wurde oben schon beschrieben,<br />
hier geht es wieder um die technischere Umsetzung.</p>
<h4>Alles hat einen Anfang – die Bootstrap-Datei</h4>
<p>Eine Datei muss die Startdatei der Applikation sein,<br />
diese Datei nennt sich im Zend Framework „Bootstrap“ (Lader / Ladeprogamm) bezeichnet.</p>
<p>Aufgaben der Bootstrap-Datei:</p>
<ul>
<li>Benötigte Skripte einbinden (include_once&#8230;)</li>
<li>Evtl. Konfigurationsdateien einlesen</li>
<li>Objekt-Initialisierung</li>
</ul>
<h4>Controller sollen aufgerufen werden – der Front Controller</h4>
<p>Das Zend Framework bietet Standard an, wie Controller und dessen Aktionen aufgerufen werden können. Im Standard schaut die URL wie folgt aus:<br />
[Controllername]/[Actionname]/[Parametername1]/[Parameterwert1]/[usw.]</p>
<p>Damit jetzt auch der entsprechende (Action) Controller und die entsprechende Aktion aufgerufen werden, gibt es den Front Controller.</p>
<p>Aufgaben des Front Controllers:</p>
<ul>
<li>Verwaltet die Anfragen</li>
<li>Leitet Anfragen an die / den entsprechenden „Action Controller“</li>
<li>Gibt die Ausgabe zurück</li>
</ul>
<p>Der Front Controller ruft damit die den entsprechenden Action Controller und die Action auf.</p>
<h4>Und jetzt&#8230;</h4>
<p>Ab hier geht es jetzt wie oben beschrieben weiter.<br />
Die Action kommuniziert mit dem Model und gibt eine Ausgabe (View) zurück.<br />
Der Front Controller kann auch noch andere Actions ausführen, die wiederum eine View zurück geben.<br />
Am Ende gibt der Front Controller die Views aus.</p>
<h4>Eine handvoll Eingriffsmöglichkeiten</h4>
<p>Das System stellt eine Vielzahl von Eingriffsmöglichkeiten parat,<br />
um Funktionalitäten zu erweitern oder hinzufügen.<br />
Hier eine kleine Auswahl:</p>
<h5>Request Object (Anfrage Objekt)</h5>
<p>Alle Informationen zur Benutzeranfrage</p>
<h5>Router (Vermittler)</h5>
<ul>
<li>Teilt die Anfrage auf, in
<ul>
<li>Controller</li>
<li>Action</li>
</ul>
<ul>
<li>beliebige Parameter (die im Controller entsprechend an Model/View übergeben werden)</li>
</ul>
<ul>
<li>Standardmäßig: [Controllername]/[Actionname]/[Parametername1]/[Parameterwert1]</li>
</ul>
</li>
<li>Es können eigene Routen definiert werden, Beispiel: „login/[Benutzername]/[Passwort]“</li>
</ul>
<h5>Dispatcher (Abfertiger / Umschalter)</h5>
<ul>
<li>Verbindet die geteilte Anfrage des Routers auf eine Klasse, Methode</li>
<li>Ruft die Methode auf</li>
</ul>
<h5>Response Object (Antwort Objekt)</h5>
<ul>
<li>beinhaltet alle Ausgaben</li>
<li>gibt diese aus</li>
</ul>
<h5>Plugins</h5>
<ul>
<li>Aufruf bei Front Controller Geschehnissen</li>
<li>Übergreifende automatische Ausführung von Aktionen</li>
</ul>
<h2>Jetzt los an die Entwicklung</h2>
<p>Nach dieser Anleitung sollte klar sein, wie das MVC Architekturmuster funktioniert, wie dieses im Zend Framework umgesetzt wurde und wie man in dessen Ablauf sinnvoll eingreifen kann.<br />
Damit sollte der Grundstein gelegt sein, um das Zend Framework zu verstehen und damit zu entwickeln.<br />
Sobald dieses Prinzip verstanden wurde, ist der Rest „nur“ noch ein Kennen der Klassen, Methoden und eine Sammlung von Erfahrungen.</p>
<p><strong>Quellen und weiterführende Links:</strong></p>
<ul>
<li><a href="http://devzone.zend.com/content/zendcon_07_slides/Ophinney_Matthew_2007-ZendCon-MVC.pdf">Zend MVC Quick Start (PDF, englisch)</a></li>
<li><a href="http://framework.zend.com/manual/de/">Zend Framework Reference Guide</a></li>
<li><a href="http://de.wikipedia.org/wiki/MVC">MVC (Wikipedia)</a></li>
<li><a href="http://de.wikipedia.org/wiki/Architekturmuster">Architekturmuster (Wikipedia)</a></li>
<li><a href="http://de.wikipedia.org/wiki/Objektorientierte_Programmierung">OOP (Wikipedia)</a></li>
<li><a href="http://zfforum.de/showthread.php?t=1207">Bestehender Diskussions-Thread zum Artikel</a></li>
<li><a href="http://kpumuk.info/php/exploring-zend_controller-class-of-zend-framework/#more-45">Etwas tiefere technische Beschreibung des Ablaufs (englisch)</a></li>
</ul>

<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.zietlow.net/zend-framework/mvc-model%e2%80%93view%e2%80%93controller-im-zend-framework/16/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
