<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <title>Zend Framework Cookbook | Das Blog zum Buch</title>
    <description>Ich bin Alexander Thomas und ich arbeite als Web Entwickler in Berlin. Zur Zeit schreibe ich das Zend Framework 2 Kochbuch für O'Reilly. Und wenn ansonsten Zeit übrig ist, stehen die Chancen gut, mich beim Herumspielen mit dubiosen Synthesizern im Tonstudio anzutreffen.</description>
    <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
    <generator>Zend_Feed_Writer 2.0.0dev1 (http://framework.zend.com)</generator>
    <link>http://zfcookbook.org</link>
    <author>author@zfcookbook.org (Alexander Thomas)</author>
    <dc:creator>Alexander Thomas</dc:creator>
    <atom:link rel="self" type="application/atom+xml" href="http://zfcookbook.org/feed/atom"/>
    <atom:link rel="self" type="application/rss+xml" href="http://zfcookbook.org/feed/rss"/>
    <item>
      <title>Wieder zurück nach Totalausfall</title>
      <description><![CDATA[<span class="excerpt">Nach einigen Tagen downtime, ist diese Seite endlich wieder da. Schuld war ein kapitaler Festplattencrash und ein dadurch verursachter Totalausfall des Servers.</span>



Jetzt ist alles wieder gut und mein Dank geht an <a href="http://thomas-niepraschk.net">Thomas Niepraschk</a> der es geschafft hat, dem Patienten alle wichtigen Informationen zu entlocken, so dass es _nur_ Arbeit, aber kein schmerzhafter Datenverlust ist.]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-wieder_zur_ck_nach_totalausfall</link>
      <guid>http://zfcookbook.org/post/view/id/post-wieder_zur_ck_nach_totalausfall</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Klassen laden im ZF2 mit dem ClassMapAutoloader</title>
      <description><![CDATA[<span class="excerpt">
	Obwohl das Zend Framework 2 an der einen oder anderen Stelle noch Baustelle ist, kann man schon einige sehr sehr vielversprechende Features erkennen und die neue Strategie f&#252;r das Laden von Klassen geh&#246;rt __definitiv__ dazu. Ich habe daher mal zusammengefasst, wie Sie sich am einfachsten selbst mal einen ersten Eindruck davon verschaffen k&#246;nnen.
</span>



### Wie funktioniert der Autoloader?

Der neue Autoloader basiert nicht mehr auf der automatischen &#220;bersetzung von Prefixes in Dateipfade, sondern auf explizit generierten Classmaps. 

Eine Classmap ist im Grunde genommen nichts weiter, als ein gigantisches Array, dass den vollst&#228;ndigen Namen (inklusive Namensraum) einer Klasse auf einen Pfad abbildet.

<pre class="brush: php;">
	return array (
		'Zend\\Acl\\Acl' => __DIR__ . DIRECTORY_SEPARATOR . 'Zend/Acl/Acl.php',

		[...]
	);
</pre>

Wenn so eine Classmap (von der es beliebig viele in einer Anwendung geben kann) an einem Objekt vom Typ <code>Zend\Loader\ClassMapAutoloader</code> registriert wird, stehen anschlie&#223;end alle darin referenzierten Klassen automatisch bereit. 

<pre class="brush: php;">
	
	require_once __DIR__ . '/../library/Zend/Loader/ClassMapAutoloader.php';
	$loader = new Zend\Loader\ClassMapAutoloader();
	$loader->registerAutoloadMap(__DIR__ . '/../library/Zend/Controller/.classmap.php');
	$loader->register();
	
</pre>

Das ist nicht nur einfach, sondern auch noch performant, wie [Matthew Weier O'Phinney herausgefunden hat](http://weierophinney.net/matthew/archives/245-Autoloading-Benchmarks.html). Viel interessanter finde ich jedoch, dass es dem Entwickler wesentlich mehr Kontrolle dar&#252;ber gibt, wie (s)eine Anwendung aufgebaut sein soll und es durch die Classmap-Dateien trotzdem immer transparent bleibt (ganz abgesehen davon, dass zus&#228;tzliche Komponenten einfach ihre eigene Classmap mitbringen k&#246;nnen und nur im Loader registriert werden m&#252;ssen).

### Vorbereitung

Als erstes brauchen Sie nat&#252;rlich den aktuellen Stand des Zend Framework 2. Der liegt derzeit ausschlie&#223;lich als Git-Repository vor. Alles was Sie daf&#252;r wissen m&#252;ssen, finden Sie im [Zend Framework Git Guide](http://framework.zend.com/wiki/display/ZFDEV2/Zend+Framework+Git+Guide).

Anschlie&#223;end finden Sie im Verzeichnis <code>bin/</code> sowohl ein Beispiel f&#252;r die Nutzung von <code>Zend\Loader\ClassMapAutoloader</code> (von dem ich mir das obige Beispiel ausgeliehen habe), als auch ein _Generator-Skript_. - Schlie&#223;lich ist es wenig erstrebenswert, alle Classmaps manuell anzulegen.

### Eine Classmap erzeugen

Das Kommandozeilenskript <code>classmap_generator.php</code> erwartet im Grunde genommen zwei Parameter:

- <code>library</code>: das Verzeichnis, von dem eine Classmap erzeugt werden soll
- <code>output</code>: Pfad zum Verzeichnis, in dem die <code>.classmap.php</code> Datei abgelegt werden soll.

Mit folgendem Aufruf k&#246;nnen Sie eine Classmap erzeugen, die alle Klassen des Zend Frameworks beinhaltet:

<pre>
	$> php ./classmap_generator.php -l /path/to/library/Zend -o /path/to/library/.classmap.php
</pre>

### Fallstricke

Ganz so einfach ist es dann aber nat&#252;rlich nicht, denn es gibt ein paar Kleinigkeiten zu beachten:

#### Ort der Classmap-Datei

Sie k&#246;nnen zwar festlegen, wohin die Classmap-Datei geschrieben werden soll, aber das Generator-Skript geht grunds&#228;tzliche davon aus, dass sie im selben Verzeichnis liegt, wie die Bibliothek, die sie beschreibt. 

F&#252;r alle anderen Situationen kommen Sie nicht darum herum, entweder das Generator-Skript oder die Classmap zu bearbeiten und die Konstante <code>__DIR__</code> durch einen alternativen Wert zu ersetzen

<pre class="brush: php;">
	$myCustomPath = '/some/custom/path';
	
	return array (
		'Zend\\Acl\\Acl' => $myCustomPath . DIRECTORY_SEPARATOR . 'Zend/Acl/Acl.php',

		[...]
	);
</pre>

#### Symlinks

Das Generator-Skript l&#246;st symbolische Links leider nicht auf!

#### Bestehende Dateien &#252;berschreiben

Es wird sich im Zuge der Entwicklung kaum vermeiden lassen, bestehende Classmaps zu aktualisieren. Daf&#252;r k&#246;nnen Sie dem Aufruf des Generator-Skritps den Parameter <code>--overwrite</code> (oder auch <code>-w</code>) hinzuf&#252;gen.

Soweit erst mal ein erster &#220;berblick. Wenn es etwas zu verbessern oder zu erg&#228;nzen gibt, freue ich mich &#252;ber jede Form von Feedback unter [@zfcookbook](http://twitter.com/zfcookbook).

]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-klassen_laden_im_zf2_mit_dem_classmapautoloader</link>
      <guid>http://zfcookbook.org/post/view/id/post-klassen_laden_im_zf2_mit_dem_classmapautoloader</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Ich sammel Themenvorschläge bei LinkedIn</title>
      <description><![CDATA[<span class="excerpt">Auf [LinkedIn](http://www.linkedin.com/) gibt es seit ein paar Tagen eine ziemlich hochkarätig besetzte [Zend Technologies Gruppe](http://www.linkedin.com/groups?home=&gid=3765135&trk=anet_ug_hm). 

Dort habe ich jetzt mal [einen Thread](http://www.linkedin.com/groups/Im-writing-Zend-Framework-2-3765135.S.42231250) eröffnet und um Themenvorschläge gebeten. Mal sehen, was da geht...
</span>]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-ich_sammel_themenvorschl_age_bei_linkedin</link>
      <guid>http://zfcookbook.org/post/view/id/post-ich_sammel_themenvorschl_age_bei_linkedin</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Es gibt Fortschritt zu vermelden</title>
      <description><![CDATA[<span class="excerpt">Champagner wäre ein wenig übertrieben, aber zumindest ein herzhaftes Schulterklopfen habe ich mir heute redlich verdient: das Kapitel zu relationalen Datenbankbetriebssystemen ist fertig und kann nun [nach Köln](http://www.oreilly.de/) zum Redigieren gehen.</span>



In Wahrheit ist es dort schon längst und ich bin schon gespannt, wie das Feedback ausfällt. Das Kapitel ist deutlich ausführlicher, als es normalerweise in einem Kochbuch zu erwarten wäre, aber relationale Datenbanken sind nach wie vor Dreh- und Angelpunkt der meisten Webanwendungen und Zend\Db damit einfach eines der wichtigsten Pakete des gesamten Zend Frameworks.

Ich habe mich entschieden, den gesamten Komplex Zend\Db\Table in einen eigenen Teil auszulagern, weil ich festgestellt habe, dass zu diesem Themenbereich viel spannendes zu sagen ist und es wäre schade, das nicht zur Geltung bringen zu können. Schließlich will ich noch mein Lieblingsthema einbringen: [Constraint basierte Modelvalidierung in Zend\Db\Table](http://www.php-unconference.de/2008/04/12/constraint-basierte-modelvalidierung-mit-dem-zend-framework/)

Wer noch Vorschläge und Ideen für Themen hat, fühle sich auf jeden Fall herzlich eingeladen. Am besten via Twitter [@zfcookbook](http://twitter.com/zfcookbook).]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-es_gibt_fortschritt_zu_vermelden</link>
      <guid>http://zfcookbook.org/post/view/id/post-es_gibt_fortschritt_zu_vermelden</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Versionsnummern und Webanwendungen</title>
      <description><![CDATA[<span class="excerpt">Im [Google Operating System](http://googlesystem.blogspot.com/) Blog habe ich gerade einen interessanten Artikel über [Versionsnummern in Googles Chrome-Browser](http://googlesystem.blogspot.com/2010/11/google-chromes-version-number-is.html) gelesen. Eigentlich müsste man von den nicht existierenden Versionsnummern sprechen, denn bei Chrome-Releases sind sie offenbar komplett bedeutungslos. - Und ich finde das super!</span>



Im Grunde genommen trägt Google damit der Erkenntnis Rechnung, dass Softwareversionen ein künstliches Konstrukt sind. Das wird klar, wenn man sich mal überlegt, wo die tollen Versionsnummern eigentlich herkommen? Sie stammen aus Zeiten, als Software auf kleinen silbernen Scheiben ausgeliefert wurde und wurden benötigt, um einen bestimmten Stand zu manifestieren, auf dessen Basis das jeweilige Goldmaster erstellt wurde. Das Goldmaster ging dann in die Presswerke, wurde vervielfältigt und ausgeliefert. Alle Fehler, die bis zu diesem Moment nicht beseitigt worden waren, konnten erst wieder im nächsten Release behoben werden.

Und heute? Der einzig wirklich relevante Distributionskanal für Software ist das Internet und dieser Kanal ist ständig verfügbar. Nach dem Release tritt ein Fehler auf? Kein Problem. Beseitigen wir ihn und liefern ein Update aus! - Noch einfacher, wenn wir es mit einer Webanwendung zu tun haben.

Nicht umsonst beschreiben [37Signals](http://wwww.37Signals.com) in ihrem Buch [Getting Real](http://gettingreal.37signals.com/ch01_What_is_Getting_Real.php) das Prinzip folgendermaßen:

<blockquote><em>You need to build, launch, and tweak. Then rinse and repeat.</em></blockquote>

In meinen Augen geht es dabei nicht darum, dass wir uns mit Fehlern in Software abgeben müssen, sondern um die Erkenntnis, dass die Umgebung, in der Software zum Einsatz kommt, beständig im Wandel ist. Das gilt für technische, wie auch für inhaltliche Rahmenbedingungen. Und wenn die Anforderungen nicht statisch sind, kann es die Software, die diese Anforderungen abbilden soll, natürlich auch nicht sein.

Die Aktualisierungsstrategie von Google vermeidet damit auch quasi nebenbei gleich noch ein Problem, dass [Webentwickler massiv umtreibt](http://it-republik.de/php/artikel/Kolumne-Das-Internet-der-zwei-Geschwindigkeiten-3409.html): Anwender, die veraltete Browserversionen aus was für immer gearteten Gründen nicht upgraden, denn nicht-upgraden ist bei Chrome keine Option mehr.]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-versionsnummern_und_webanwendungen</link>
      <guid>http://zfcookbook.org/post/view/id/post-versionsnummern_und_webanwendungen</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Zend_Tool und Zend\Tool für ZF2 parallel betreiben</title>
      <description><![CDATA[<span class="excerpt">Der beste Weg, um mal einen Blick auf das rasant voranschreitende Zend Framework 2 zu werfen, ist eine kleine Demo-App, die man mit Hilfe des <code>zf</code> Befehls auf der Kommandozeile erzeugt. Aber nur für einen ersten Blick, will man natürlich nicht das komplette Setup über den Haufen werfen...</span><br /><br /><br /><br />Rob Allen beschreibt deshalb in einem [Blog Post](http://akrabat.com/zend-framework/setting-up-zf2s-zendtool-side-by-side-with-zf1/) einen kompakten Weg, wie man beide <code>zf</code> Tools (für Zend Framework 1 und 2) bequen parallel betreiben kann.<br /><br />Im Endeffekt empfiehlt er, zur Nutzung von Zend Framwork 2 ein Alias anzulegen. Damit ist es möglich, beide Tools, trotz ihres identischen Namens, getrennt voneinander aufzurufen.<br /><br />Es sollte allerdings ergänzt werden, dass dieser Weg nicht für Windows Nutzer funktioniert. Hier würde mir als einzige Lösung eine [Cygwin-Installation](http://www.cygwin.com/) einfallen, aber ich finde das ist unter Windows immer eine gute Idee.
]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-zend_tool_und_zend_tool_f_ur_zf2_parallel_betreiben</link>
      <guid>http://zfcookbook.org/post/view/id/post-zend_tool_und_zend_tool_f_ur_zf2_parallel_betreiben</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>PHP Unconference 2010</title>
      <description><![CDATA[<span class="excerpt">Auch dieses Jahr findet am 25. und 26. September die <a href="http://www.php-unconference.de/">PHP Unconference</a> in Hamburg statt. - Und ich bin endlich wieder dabei.</span>



Obwohl ich gestehen muss, dass ich mich viel zu spät um ein Ticket gekümmert habe.

<p class="center"><img src="/uploads/php-unconf.png" alt="Banner PHP Unconference"></p>

Ich freue mich riesig, denn mein letzter Besuch vor zwei Jahren war grosses Kino. Spannende Sessions, jede Menge nette Menschen und nicht zuletzt, meine erste <a href="http://www.php-unconference.de/2008/04/12/constraint-basierte-modelvalidierung-mit-dem-zend-framework/">eigene Session</a> in einem solchen Kontext, die durchaus positiv angenommen wurde.

Dieses Jahr werde ich es wohl voraussichtlich nicht schaffen, eine eigene Session vorzubereiten. Mir fehlt schlicht und ergreifend die Zeit und ich möchte gerade dort ungern mit einem halbgaren Thema auflaufen.

Dafür habe ich mehr Ruhe für die Flut <a href="http://www.php-unconference.org/voteyourtalk/index.php/default/index/">spannender Themen</a> und Eindrücke. Mehr dann hier in Kürze.]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-php_unconference_2010</link>
      <guid>http://zfcookbook.org/post/view/id/post-php_unconference_2010</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Vertragsunterzeichnung erfolgreich abgeschlossen</title>
      <description><![CDATA[<span class="excerpt">Ein bisschen stolz war ich schon, als ich vor ein paar Tagen die Verträge zum Buch in den Händen hatte.</span>



<img src="/uploads/foto-3-2.jpg" alt="Verträge in zwei Ausführungen">

Jetzt ist alles unter Dach und Fach und ich freue mich auf ein super spannendes Projekt! Ach ja, ist das Briefpapier nicht der Hammer?]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-vertragsunterzeichnung_erfolgreich_abgeschlossen</link>
      <guid>http://zfcookbook.org/post/view/id/post-vertragsunterzeichnung_erfolgreich_abgeschlossen</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
    <item>
      <title>Hallo Welt</title>
      <description><![CDATA[<p class="excerpt">Kein Blog auf dieser Welt sollte starten, ohne ein ordentliches Hallo Welt als erstes Post...</p>

Dann kann es ja jetzt losgehen!


]]></description>
      <pubDate>Sun, 20 May 2012 09:43:04 +0200</pubDate>
      <link>http://zfcookbook.org/post/view/id/post-hallo_welt</link>
      <guid>http://zfcookbook.org/post/view/id/post-hallo_welt</guid>
      <author>author@zfcookbook.org (Alexander Thomas)</author>
      <dc:creator>Alexander Thomas</dc:creator>
      <slash:comments>0</slash:comments>
    </item>
  </channel>
</rss>

