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ür das Laden von Klassen gehört definitiv dazu. Ich habe daher mal zusammengefasst, wie Sie sich am einfachsten selbst mal einen ersten Eindruck davon verschaffen können.
Wie funktioniert der Autoloader?
Der neue Autoloader basiert nicht mehr auf der automatischen Ü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ändigen Namen (inklusive Namensraum) einer Klasse auf einen Pfad abbildet.
return array (
'Zend\\Acl\\Acl' => __DIR__ . DIRECTORY_SEPARATOR . 'Zend/Acl/Acl.php',
[...]
);
Wenn so eine Classmap (von der es beliebig viele in einer Anwendung geben kann) an einem Objekt vom Typ Zend\Loader\ClassMapAutoloader registriert wird, stehen anschließend alle darin referenzierten Klassen automatisch bereit.
require_once __DIR__ . '/../library/Zend/Loader/ClassMapAutoloader.php';
$loader = new Zend\Loader\ClassMapAutoloader();
$loader->registerAutoloadMap(__DIR__ . '/../library/Zend/Controller/.classmap.php');
$loader->register();
Das ist nicht nur einfach, sondern auch noch performant, wie Matthew Weier O'Phinney herausgefunden hat. Viel interessanter finde ich jedoch, dass es dem Entwickler wesentlich mehr Kontrolle darüber gibt, wie (s)eine Anwendung aufgebaut sein soll und es durch die Classmap-Dateien trotzdem immer transparent bleibt (ganz abgesehen davon, dass zusätzliche Komponenten einfach ihre eigene Classmap mitbringen können und nur im Loader registriert werden müssen).
Vorbereitung
Als erstes brauchen Sie natürlich den aktuellen Stand des Zend Framework 2. Der liegt derzeit ausschließlich als Git-Repository vor. Alles was Sie dafür wissen müssen, finden Sie im Zend Framework Git Guide.
Anschließend finden Sie im Verzeichnis bin/ sowohl ein Beispiel für die Nutzung von Zend\Loader\ClassMapAutoloader (von dem ich mir das obige Beispiel ausgeliehen habe), als auch ein Generator-Skript. - Schließlich ist es wenig erstrebenswert, alle Classmaps manuell anzulegen.
Eine Classmap erzeugen
Das Kommandozeilenskript classmap_generator.php erwartet im Grunde genommen zwei Parameter:
library: das Verzeichnis, von dem eine Classmap erzeugt werden soll
output: Pfad zum Verzeichnis, in dem die .classmap.php Datei abgelegt werden soll.
Mit folgendem Aufruf können Sie eine Classmap erzeugen, die alle Klassen des Zend Frameworks beinhaltet:
$> php ./classmap_generator.php -l /path/to/library/Zend -o /path/to/library/.classmap.php
Fallstricke
Ganz so einfach ist es dann aber natürlich nicht, denn es gibt ein paar Kleinigkeiten zu beachten:
Ort der Classmap-Datei
Sie können zwar festlegen, wohin die Classmap-Datei geschrieben werden soll, aber das Generator-Skript geht grundsätzliche davon aus, dass sie im selben Verzeichnis liegt, wie die Bibliothek, die sie beschreibt.
Für alle anderen Situationen kommen Sie nicht darum herum, entweder das Generator-Skript oder die Classmap zu bearbeiten und die Konstante DIR durch einen alternativen Wert zu ersetzen
$myCustomPath = '/some/custom/path';
return array (
'Zend\\Acl\\Acl' => $myCustomPath . DIRECTORY_SEPARATOR . 'Zend/Acl/Acl.php',
[...]
);
Symlinks
Das Generator-Skript löst symbolische Links leider nicht auf!
Bestehende Dateien überschreiben
Es wird sich im Zuge der Entwicklung kaum vermeiden lassen, bestehende Classmaps zu aktualisieren. Dafür können Sie dem Aufruf des Generator-Skritps den Parameter --overwrite (oder auch -w) hinzufügen.
Soweit erst mal ein erster Überblick. Wenn es etwas zu verbessern oder zu ergänzen gibt, freue ich mich über jede Form von Feedback unter @zfcookbook.