Zend Framework

Das neue Framework 1.8 ist nun raus… *freu* Hier eine grobe Liste meiner Erfahrungen mit der Version 1.8 die ich seit einer Woche benutze. Die Liste ist nicht vollständig soll aber trotzdem einen kurzen Überblick über neue Dinge in der Version 1.8 geben. Für mich besonders auffällig ist das Bestreben aus dem Zend Framework jetzt wirklich ein Framework zu machen. Die Kritik dass, es nur reine Sammlung von PHP Klassen wäre kann nun seit der Version 1.8 nicht mehr gelten.

Komponenten wie Zend_Application und Zend_Tool bieten nun auch Scaffolding, was man vielleicht aus Rails kennt. Im Hintergrund nutzt Zend_Tool die neue Komponente Zend_CodeGenerator, welche “on the fly” PHP Code generieren kann. Ergänzt wird diese durch den vereinfachten lesenden Zugriff via Zend_Reflection (Beispiel am Ende des Artikels).

Zend_Loader

Der alte Autoloader Zend_Loader::autoloader der über Zend\_Loader::registerAutoload registriert wurde ist nun als deprecated markiert. Man sollte nun den neuen Zend_Loader_Autoloader nutzen. Die API Änderung ist nicht sehr schon, dafür entschädigt der neuen Autoloader mit einigen neuen Funktionen. So lassen sich nun Namespaces definieren.

Beispiel:

// Register autoloader
require_once 'Zend/Loader/Autoloader.php';
$autoLoader = Zend_Loader_Autoloader::getInstance();
$autoLoader->registerNamespace('Inmon_');

Es lassen sich sogar Autoloader aus anderen Frameworks verwenden:
Beispiel ezComponents:

$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');

Toll ist auch der neue Resource Loader, der Plugins, Helper, Models, Formulare usw. laden kann. Dieser kann z.B. in einer Bootstrap Klasse innerhalb eines Module initialisiert werden. Dafür bietet Zend_Application die neue Klassen Zend_Application_Module_Bootstrap. Die Bootstrap sollte direkt im Modul-Verzeichnis liegen.

Beispiel einer Modul-Bootstrap für ein Admin-Modul:

'Admin',
            'basePath'  => dirname(\_\_FILE\_\_),
        ));
        return $autoloader;
    }
}

Zend_Application sucht in jedem Modul nach der Klasse Bootstrap. Wird diese gefunden werden alle “_init” Methoden automatisch ausgeführt. Im vorherigen Fall wird der Autoloader für das Modul initalisiert. Der Autoloader initialisiert alle Pfade selbständig.
Der Zend_Application_Module_Autoloader kann von Haus aus folgende Resourcen laden:

  • Forms
  • Plugins
  • Models
  • DbTables
  • Services
  • View Helper
  • View Filter

Zend_Application

Zend_Application ist eine neue Komponente die es erlaubt die Initialisierung und den Zugriff auf Resourcen wie z.B. Datenbankverbindungen, Helper usw… zu standadisieren.

Die Komponente erlaubt es eigene Resourcen zu definieren und deren Konfiguration in einer Zend_Config zu verwalten. Es stehen bereits einiges Standard-Resourcen wie z.B. FrontController, View, Router, Db, Layout, Translate, Session bereit.

Nutzt man Zend_Application durchgängig kann man Resourcen die man in verschiedenen Anwendungen verwendet erneut benutzen. Es ist zudem möglich die Module der Anwendung über Zend_Application zu konfigurieren. Dies wird intern durch die Resource Zend_Application_Resource_Modules durchgeführt.

Achtung!: Damit diese initialisiert wird muss in der Konfiguration ein Eintrag für die Resource bestehen. In meinem Fall muss folgender Eintrag in der Ini Datei (funktioniert auch mit XML) stehen.

; Modules resource -> Ohne diesen Eintrag werden die Module-Konfiguration nicht geladen!
resources.modules =

; Beispiel für das Überschreiben einer Datenbank Konfiguration innerhalb eines Moduls...
; Dies wird nur für das Modul "mymodule" durchgeführt
mymodule.resources.db.params.dbname = "meine_datenbank"

Die Komponente kapselt alle Resourcen in kleinere “Bootstraps” die von einer “großen” Bootstrap Klasse angesteuert werden. Durch die neue organistation der Resourcen ist es jetzt auch Möglich für einen Cronjob nur bestimmte Resourcen zu laden.

Was auffällt ist, dass man sich auch Gedanken über Abhängigkeiten gemacht hat.

Eine genauere Beschreibung würde hier den Rahmen sprengen.

Das Handbuch http://www.framework.zend.com/manual/de/zend.application.html gibt hier die restlichen Möglichkeiten preis.

Zend_Controller

Die Routen unterstützen nun das Übersetzen von Parametern mittels Zend_Translate. Siehe hierzu: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.standard.translated-segments

Zend_Reflection

Das Paket stellt einen Wrapper zur PHP Reflection API dar. Es lässt sich vereinfacht auf Information zugreifen. Beispiel (Methoden Eltern-Klasse innerhalb einer Klasse):

$reflectionClass = new Zend_Reflection_Class(__CLASS__);
print_r($reflectionClass->getParentClass()->getMethods());

Offizielle Liste der Änderungen

http://devzone.zend.com/article/4524-Zend-Framework-1.8.0-Released

  • Zend_Tool, contributed by Ralph Schindler
  • Zend_Application, contributed by Ben Scholzen and Matthew Weier O’Phinney
  • Zend_Loader_Autoloader and Zend_Loader_Autoloader_Resource, contributed by Matthew Weier O’Phinney
  • Zend_Navigation, contributed by Robin Skoglund
  • Zend_CodeGenerator, by Ralph Schindler
  • Zend_Reflection, Ralph Schindler and Matthew Weier O’Phinney
  • Zend Server backend for Zend_Cache, contributed by Alexander Veremyev
  • Zend_Service_Amazon_Ec2, contributed by Jon Whitcraft
  • Zend_Service_Amazon_S3, Justin Plock and Stas Malyshev
  • Incorporated Dojo 1.3
  • Added support for arbitrary Dojo Dijits via view helpers
  • Zend_Filter_Encrypt, contributed by Thomas Weidner
  • Zend_Filter_Decrypt, contributed by Thomas Weidner
  • Zend_Filter_LocalizedToNormalized and _NormalizedToLocalized, contributed by Thomas Weidner
  • Support for file upload progress support in Zend_File_Transfer, contributed by Thomas Weidner
  • Translation-aware routes, contributed by Ben Scholzen
  • Route chaining capabilities, contributed by Ben Scholzen
  • Zend_Json expression support, contributed by Benjamin Eberlei and Oscar Reales
  • Zend_Http_Client_Adapter_Curl, contributed by Benjamin Eberlei
  • SOAP input and output header support, contributed by Alexander Veremyev
  • Support for keyword field search using query strings, contributed by Alexander Veremyev
  • Support for searching across multiple indexes in Zend_Search_Lucene, contributed by Alexander Veremyev
  • Significant improvements for Zend_Search_Lucene search result match highlighting capabilities, contributed by Alexander Veremyev
  • Support for page scaling, shifting and skewing in Zend_Pdf, contributed by Alexander Veremyev
  • Zend_Tag_Cloud, contributed by Ben Scholzen
  • Locale support in Zend_Validate_Int and Zend_Validate_Float, contributed by Thomas Weidner
  • Phonecode support in Zend_Locale, contributed by Thomas Weidner
  • Zend_Validate_Db_RecordExists and _RecordNotExists, contributed by Ryan Mauger
  • Zend_Validate_Iban, contributed by Thomas Weidner
  • Zend_Validate_File_WordCount, contributed by Thomas Weidner