galileocomputing_zendframework2

  • Published on
    18-Oct-2015

  • View
    64

  • Download
    0

Transcript

Ralf EggertZend Framework 2Das PraxisbuchAuf einen BlickAuf einen BlickTEIL I Die Grundlagen1 Einfhrung in das Zend Framework 2 ............................................................. 272 Neuerungen im Zend Framework 2 ................................................................. 333 Das Zend Framework einrichten ...................................................................... 53TEIL II Die Komponenten4 Basis-Komponenten ............................................................................................. 875 Der Event-Manager ............................................................................................... 1176 Service Location & Dependency Injection ..................................................... 1277 Der Modul-Manager ............................................................................................. 1518 MVC-Komponenten .............................................................................................. 1839 View-Komponenten .............................................................................................. 23710 Datenbank-Komponenten .................................................................................. 25711 Ausgabe-Komponenten ...................................................................................... 28912 Formularverarbeitung .......................................................................................... 31513 Benutzermanagement ......................................................................................... 35114 Sonstige Komponenten ....................................................................................... 369TEIL III Die Module15 Das Anwendungsmodul ...................................................................................... 38316 Das Blog-Modul ...................................................................................................... 41117 Das Benutzer-Modul ............................................................................................. 45318 Das Pizza-Modul ..................................................................................................... 48319 Das Kommentar-Modul ....................................................................................... 50520 Das Spamabwehr-Modul .................................................................................... 52521 Das CMS-Modul ...................................................................................................... 54922 Das Shop-Modul ..................................................................................................... 565Inhalt5InhaltGeleitwort .............................................................................................................................................. 19Vorwort .................................................................................................................................................. 21Vorwort des Autors zur Vorauflage .............................................................................................. 23TEIL I Die Grundlagen1 Einfhrung in das Zend Framework 2 271.1 Abgrenzung zu anderen PHP-Frameworks ........................................................ 271.2 Die Zielgruppe des Buches .................................................................................... 281.3 Wegweiser ................................................................................................................ 281.4 berblick ber die Komponenten ........................................................................ 291.5 Listings, Projektdateien, Programmierrichtlinien ............................................ 311.6 Der Zend Framework 2-Kosmos ........................................................................... 311.7 Links zum Buch ........................................................................................................ 322 Neuerungen im Zend Framework 2 332.1 Begrifflichkeiten ...................................................................................................... 332.2 PHP-Version .............................................................................................................. 342.2.1 PHP-Namespaces ....................................................................................... 342.2.2 Closures ....................................................................................................... 362.2.3 Late Static Binding ..................................................................................... 382.3 Git und GitHub ......................................................................................................... 392.4 Neue Konzepte ........................................................................................................ 402.4.1 Verbesserte Modularitt ........................................................................... 402.4.2 Dependency Injection ................................................................................ 412.4.3 Service-Locator ........................................................................................... 432.4.4 Ereignisgesteuerte Architektur ................................................................ 452.5 Komponentenvergleich ......................................................................................... 482.6 Vor- und Nachteile des ZF2 ................................................................................... 50Inhalt63 Das Zend Framework einrichten 533.1 Voraussetzungen .................................................................................................... 533.1.1 PHP-Version ................................................................................................ 533.1.2 PHP-Extensions .......................................................................................... 543.1.3 Apache 2-Konfiguration ............................................................................ 573.1.4 Virtual Host einrichten unter Linux ......................................................... 573.1.5 Virtual Host einrichten unter Windows .................................................. 593.1.6 Weitere Informationen ............................................................................. 603.2 Zend Framework 2 installieren ............................................................................. 613.2.1 Installation aus einem ZIP-Paket .............................................................. 613.2.2 Installation mit Pyrus ................................................................................ 623.2.3 Installation mit Composer ........................................................................ 653.3 SkeletonApplication installieren ......................................................................... 683.3.1 Installation aus einem ZIP-Paket .............................................................. 693.3.2 Installation mit Git ..................................................................................... 693.3.3 Einrichtung mit Composer ........................................................................ 703.4 Struktur einer Zend Framework 2-Anwendung ................................................ 713.4.1 Hauptverzeichnis ....................................................................................... 713.4.2 Das Konfigurationsverzeichnis ................................................................. 733.4.3 Das Public-Verzeichnis .............................................................................. 743.4.4 Vendor-Verzeichnis .................................................................................... 763.4.5 Das Modulverzeichnis ............................................................................... 773.4.6 Kaskadierendes Laden der Konfigurationsdaten ................................... 823.4.7 Autoloading mit Composer ...................................................................... 83TEIL II Die Komponenten4 Basis-Komponenten 874.1 Zend\Loader ............................................................................................................. 874.1.1 StandardAutoloader .................................................................................. 884.1.2 ClassMapAutoloader ................................................................................. 884.1.3 AutoloaderFactory ..................................................................................... 894.1.4 Eigenen Autoloader erstellen ................................................................... 904.2 Zend\Config ............................................................................................................. 904.2.1 Konfigurationsdateien lesen .................................................................... 904.2.2 Konfigurationsdateien schreiben ............................................................ 91Inhalt74.3 Zend\Cache .............................................................................................................. 924.3.1 Cache-Storages .......................................................................................... 924.3.2 Storage-Plugins und Capabilities ............................................................. 944.3.3 Cache-Patterns ........................................................................................... 954.4 Zend\Log ................................................................................................................... 964.4.1 Zusammenspiel der Teilkomponenten ................................................... 974.4.2 Writer .......................................................................................................... 984.4.3 Formatter .................................................................................................... 984.4.4 Filter ............................................................................................................. 984.5 Zend\Mail und Zend\Mime .................................................................................. 994.5.1 Eine E-Mail-Nachricht erstellen ................................................................ 1004.5.2 Eine E-Mail-Nachricht versenden ............................................................. 1004.5.3 MIME-Nachricht erstellen ......................................................................... 1014.5.4 E-Mail-Nachrichten abrufen ..................................................................... 1024.6 Zend\Filter ................................................................................................................ 1034.6.1 Standardfilter ............................................................................................. 1044.6.2 Statische Filter ............................................................................................ 1064.6.3 Filterketten ................................................................................................. 1074.6.4 Eigenen Filter erstellen .............................................................................. 1074.7 Zend\Validator ........................................................................................................ 1084.7.1 Standardvalidatoren .................................................................................. 1094.7.2 Statische Validatoren ................................................................................ 1114.7.3 Validatorketten .......................................................................................... 1124.7.4 Eigenen Validator erstellen ....................................................................... 1134.7.5 Validator-Fehlermeldungen anpassen .................................................... 1155 Der Event-Manager 1175.1 Einfhrung ................................................................................................................ 1175.2 EventManagerAwareInterface ............................................................................. 1185.3 Listener mit Closures umsetzen ........................................................................... 1195.4 Listener mit Aggregaten umsetzen ..................................................................... 1215.5 bergabe von Parametern an Listener ............................................................... 1245.6 SharedEventManager ............................................................................................. 124Inhalt86 Service Location & Dependency Injection 1276.1 Zend\ServiceManager ............................................................................................ 1276.1.1 Beispielklassen ........................................................................................... 1286.1.2 Untersttzte Instanziierungsarten .......................................................... 1306.1.3 Den Service-Manager konfigurieren ........................................................ 1316.1.4 Konfigurationsklasse ................................................................................. 1326.1.5 Konfigurationsdatei ................................................................................... 1336.1.6 Initializer einrichten .................................................................................. 1356.1.7 Abstrakte Fabrik verwenden ..................................................................... 1376.1.8 Den Service-Manager richtig nutzen ....................................................... 1406.2 Zend\Di ..................................................................................................................... 1416.2.1 Automatische Erkennung mit RuntimeDefinition ............................. 1416.2.2 Definition kompilieren mit CompilerDefinition ................................. 1446.2.3 Abhngigkeiten konfigurieren ................................................................. 1476.2.4 Zend\Di richtig nutzen .............................................................................. 1507 Der Modul-Manager 1517.1 Einfhrung ................................................................................................................ 1517.2 Aufbau eines Moduls .............................................................................................. 1527.2.1 Die Modul-Klasse ....................................................................................... 1537.2.2 Das Konfigurationsverzeichnis ................................................................. 1557.2.3 Assets im Public-Verzeichnis .................................................................... 1557.2.4 Das Source-Verzeichnis ............................................................................. 1567.2.5 Tests ............................................................................................................ 1567.2.6 Das View-Verzeichnis ................................................................................ 1577.3 Modulkonfiguration ............................................................................................... 1577.3.1 Autoloading konfigurieren ....................................................................... 1577.3.2 Konfigurationsdaten bereitstellen .......................................................... 1587.3.3 Services konfigurieren ............................................................................... 1617.3.4 Controller konfigurieren ........................................................................... 1647.3.5 Controller-Plugins konfigurieren ............................................................. 1667.3.6 View-Helper konfigurieren ....................................................................... 1677.3.7 Weitere Konfigurationen .......................................................................... 1697.4 Ein Anwendungsmodul entwickeln .................................................................... 1697.4.1 Die Modul-Klasse ....................................................................................... 1707.4.2 Modulkonfiguration .................................................................................. 171Inhalt97.4.3 Controller und View-Script einrichten ..................................................... 1737.4.4 Request-Parameter verwenden ............................................................... 1757.5 Library-Modul erstellen ......................................................................................... 1777.6 Fremdmodule installieren ..................................................................................... 1797.6.1 Die ZendDeveloperTools mit Composer installieren ............................. 1797.6.2 ZfcUser und ZfcBase mit Git klonen ........................................................ 1818 MVC-Komponenten 1838.1 Einfhrung ................................................................................................................ 1838.2 Application ............................................................................................................... 1848.2.1 Initialisierungsprozess ............................................................................... 1848.2.2 Bootstrapping ............................................................................................. 1868.2.3 Der Verarbeitungsprozess ......................................................................... 1888.3 Services ...................................................................................................................... 1898.4 Routing ...................................................................................................................... 1928.4.1 Route-Typen ............................................................................................... 1928.4.2 Der Route-Typ Hostname ...................................................................... 1938.4.3 Der Route-Typ Literal ............................................................................. 1948.4.4 Der Route-Typ Regex ............................................................................. 1958.4.5 Der Route-Typ Segment ........................................................................ 1968.4.6 SimpleRouteStack ...................................................................................... 1978.4.7 TreeRouteStack .......................................................................................... 1988.4.8 Routing konfigurieren ............................................................................... 2018.4.9 Routing-Tipps ............................................................................................. 2038.5 Events ........................................................................................................................ 2058.5.1 Das route-Event fr die Sprachfestlegung nutzen ............................. 2058.5.2 Das dispatch.error-Event fr das Logging nutzen .............................. 2068.5.3 Das finish-Event fr die Zeitmessung nutzen .................................... 2098.6 Controller .................................................................................................................. 2118.6.1 Einfhrung .................................................................................................. 2118.6.2 Action-Controller ....................................................................................... 2128.6.3 Zugriff auf Objekte .................................................................................... 2148.6.4 Services injizieren ....................................................................................... 2158.6.5 RESTful-Controller ...................................................................................... 2188.7 Controller-Plugins ................................................................................................... 2248.7.1 Zugriff auf Plugins ..................................................................................... 224Inhalt108.7.2 Das Layout-Plugin .................................................................................. 2258.7.3 Das Url-Plugin ........................................................................................ 2258.7.4 Das Redirect-Plugin ................................................................................ 2278.7.5 Das Forward-Plugin ............................................................................... 2278.7.6 Das Params-Plugin ................................................................................. 2298.7.7 Das PostRedirectGet-Plugin .................................................................. 2298.7.8 Das FilePostRedirectGet-Plugin ............................................................ 2318.7.9 Das FlashMessenger-Plugin .................................................................. 2338.7.10 Ein eigenes Plugin erstellen ...................................................................... 2349 View-Komponenten 2379.1 Einfhrung in Zend\View ...................................................................................... 2379.1.1 Bestandteile ................................................................................................ 2379.1.2 Teilkomponenten ....................................................................................... 2389.1.3 Konfiguration ............................................................................................. 2409.2 ViewModels .............................................................................................................. 2419.2.1 ViewModels verschachteln ....................................................................... 2429.2.2 Weitere View-Models ................................................................................ 2439.3 Resolver, Renderer und Strategies ...................................................................... 2449.3.1 Resolver ....................................................................................................... 2449.3.2 Renderer ...................................................................................................... 2459.3.3 Strategies .................................................................................................... 2459.4 View-Scripts .............................................................................................................. 2479.5 View-Helper .............................................................................................................. 2489.5.1 View-Helper fr HTML-Kopfdaten ........................................................... 2499.5.2 View-Helper fr URLs ................................................................................. 2509.5.3 View-Helper fr das Escaping ................................................................... 2509.5.4 Weitere View-Helper ................................................................................. 2519.5.5 Einen eigenen View-Helper erstellen ...................................................... 2539.6 Template-Engines ................................................................................................... 25610 Datenbank-Komponenten 25710.1 Das Datenbankmodell ............................................................................................ 25710.2 Datenbankadapter .................................................................................................. 258Inhalt1110.2.1 Konfiguration eines Adapters ................................................................... 25810.2.2 Ausfhren von lesenden Abfragen .......................................................... 26010.2.3 Ausfhren von schreibenden Abfragen .................................................. 26110.2.4 ResultSet fr Adapter konfigurieren ........................................................ 26210.3 SQL-Abfragen generieren ...................................................................................... 26510.3.1 Lesende Abfragen generieren ................................................................... 26510.3.2 Schreibende Abfragen generieren ........................................................... 26810.3.3 Abfragen mit DDL generieren ................................................................... 27010.4 Gateway-Klassen ..................................................................................................... 27110.4.1 Zend\Db\TableGateway ........................................................................... 27110.4.2 TableGateway-Features ............................................................................ 27410.4.3 Zend\Db\RowGateway ............................................................................. 27810.5 Doctrine 2 .................................................................................................................. 28110.5.1 Installation und Konfiguration ................................................................. 28110.5.2 Modul und Entitten vorbereiten ............................................................ 28210.5.3 Doctrine 2 einsetzen .................................................................................. 28611 Ausgabe-Komponenten 28911.1 Zend\I18n .................................................................................................................. 28911.1.1 Translator .................................................................................................... 28911.1.2 View-Helper ................................................................................................ 29211.1.3 Fehlermeldungen fr Zend\Validator bersetzen ................................. 29411.2 Zend\Navigation ..................................................................................................... 29511.2.1 Container und Seiten anlegen .................................................................. 29511.2.2 Navigation konfigurieren .......................................................................... 29711.2.3 Navigation ausgeben ................................................................................ 29911.2.4 Navigation und ACL ................................................................................... 30111.3 Zend\Paginator ....................................................................................................... 30211.3.1 Adapter fr Zend\Paginator ..................................................................... 30311.3.2 Seitennavigation ........................................................................................ 30511.4 Zend\Feed ................................................................................................................. 30911.4.1 Feeds lesen .................................................................................................. 30911.4.2 Feeds schreiben .......................................................................................... 31011.4.3 Feeds mit Zend\Mvc und Zend\View ...................................................... 31111.5 Weitere Hilfskomponenten .................................................................................. 31211.5.1 Zend\Escaper .............................................................................................. 312Inhalt1211.5.2 Zend\Json ................................................................................................... 31211.5.3 Zend\Tag ..................................................................................................... 31311.5.4 Zend\Barcode ............................................................................................. 31412 Formularverarbeitung 31512.1 Zend\InputFilter ...................................................................................................... 31512.1.1 Ein InputFilter-Objekt erstellen ................................................................ 31512.1.2 Factory mit Konfigurationsdaten nutzen ................................................ 31712.1.3 InputFilter als eigenstndige Klassen ...................................................... 31812.1.4 Hierarchische InputFilter .......................................................................... 32012.1.5 InputFilter im MVC .................................................................................... 32212.2 Zend\Form ................................................................................................................ 32212.2.1 Einfhrung .................................................................................................. 32312.2.2 Ein Form-Objekt erstellen ......................................................................... 32312.2.3 Fieldsets ...................................................................................................... 32512.2.4 Collections .................................................................................................. 32812.2.5 Elemente ..................................................................................................... 33112.2.6 Ausgabe mit View-Helpern ....................................................................... 33312.2.7 Validierung von Formularen ..................................................................... 33712.2.8 Objekte anbinden ...................................................................................... 34012.2.9 Annotationen ............................................................................................. 34312.2.10 Datei-Uploads ............................................................................................ 34613 Benutzermanagement 35113.1 Zend\Session ............................................................................................................ 35113.1.1 Mit Session-Containern arbeiten ............................................................. 35113.1.2 Session-Manager verwenden ................................................................... 35213.1.3 Sessions in der Datenbank speichern ...................................................... 35313.2 Zend\Permissions\Acl ............................................................................................ 35513.2.1 Begrifflichkeiten ......................................................................................... 35513.2.2 ACL definieren ............................................................................................ 35513.2.3 ACL abfragen .............................................................................................. 35713.2.4 ACL cachen .................................................................................................. 35713.3 Zend\Permissions\Rbac ........................................................................................ 35813.3.1 Begrifflichkeiten ......................................................................................... 358Inhalt1313.3.2 RBAC definieren ......................................................................................... 35913.3.3 RBAC abfragen ............................................................................................ 36013.4 Zend\Authentication ............................................................................................. 36113.4.1 Per HTTP authentifizieren ......................................................................... 36113.4.2 Gegen eine Datenbanktabelle authentifizieren ..................................... 36313.4.3 Authentifizierungsservice ......................................................................... 36513.5 Zend\Ldap ................................................................................................................. 36814 Sonstige Komponenten 36914.1 Zend\Http ................................................................................................................. 36914.1.1 HTTP-Anfrage senden und verarbeiten ................................................... 36914.1.2 Verbindungsadapter .................................................................................. 37014.1.3 Fortgeschrittener Einsatz .......................................................................... 37014.2 Zend\Soap ................................................................................................................ 37114.2.1 SOAP-Server bereitstellen ......................................................................... 37114.2.2 SOAP-Client einsetzen ............................................................................... 37314.3 Zend\XmlRpc ........................................................................................................... 37414.3.1 XML-RPC-Server bereitstellen ................................................................... 37414.3.2 XML-RPC-Client einsetzen ......................................................................... 37514.4 Zend\Crypt ............................................................................................................... 37614.5 Zend\Stdlib ............................................................................................................... 377TEIL III Die Module15 Das Anwendungsmodul 38315.1 Anforderungen ........................................................................................................ 38315.2 Anwendungsmodul konfigurieren ...................................................................... 38415.3 Eigene View-Helper ................................................................................................ 38815.3.1 Der View-Helper PageTitle .................................................................... 38815.3.2 Der View-Helper ShowMessages ......................................................... 38915.3.3 Der View-Helper ShowForm ................................................................. 39115.3.4 Der View-Helper Date ............................................................................ 393Inhalt1415.4 Mehrstufiges Seitenlayout .................................................................................. 39515.5 Men im Seitenkopf einrichten ......................................................................... 39915.6 Controller und View-Scripts ................................................................................ 40115.7 Meldungen der Validatoren bersetzen .......................................................... 40215.8 Pagination ............................................................................................................... 40315.9 Eigene Filter ............................................................................................................ 40415.9.1 Der StringToUrl-Filter .......................................................................... 40415.9.2 Der StringHtmlPurifier-Filter .............................................................. 40615.9.3 Konfiguration fr beide Filter ................................................................. 40715.10 CKEditor ................................................................................................................... 40916 Das Blog-Modul 41116.1 Anforderungen ........................................................................................................ 41116.2 Das Blog-Modul einrichten ................................................................................... 41216.3 Modelinfrastruktur ................................................................................................. 41916.3.1 Datenbank einrichten ................................................................................ 41916.3.2 Klassen erstellen ........................................................................................ 42116.4 Filter und Formulare ............................................................................................... 42516.4.1 Filter und Validierung ................................................................................ 42616.4.2 Formularklasse ........................................................................................... 42716.4.3 Factories ...................................................................................................... 42916.5 Den Blog-Service einrichten .................................................................................. 43116.5.1 Formular-Objekte injizieren ...................................................................... 43216.5.2 Der Blog-Service berblick ..................................................................... 43316.6 ffentlicher Bereich ................................................................................................ 44016.6.1 Action-Controller einrichten ..................................................................... 44016.6.2 View-Scripts einrichten ............................................................................. 44316.7 Administrationsbereich ......................................................................................... 44416.7.1 Action-Controller einrichten ..................................................................... 44516.7.2 View-Scripts einrichten ............................................................................. 44716.8 Optimierungen ........................................................................................................ 451Inhalt1517 Das Benutzer-Modul 45317.1 Anforderungen ........................................................................................................ 45317.2 Vorbereitungen ....................................................................................................... 45417.3 Authentifizierung und Autorisierung ................................................................. 45517.3.1 Authentifizierungsadapter ....................................................................... 45617.3.2 Authentifizierungsservice ......................................................................... 46017.3.3 Autorisierungsservice ................................................................................ 46117.3.4 Konfiguration der Benutzerrechte ........................................................... 46417.4 User-Service einrichten .......................................................................................... 46617.5 View-Helper einrichten .......................................................................................... 47017.5.1 Der View-Helper UserIsAllowed ........................................................... 47017.5.2 Der View-Helper UserShowWidget ..................................................... 47117.6 UserListener einrichten .......................................................................................... 47517.7 ffentlicher Bereich ................................................................................................ 47817.7.1 Den Action-Controller einrichten ............................................................. 47817.7.2 View-Scripts einrichten ............................................................................. 48118 Das Pizza-Modul 48318.1 Anforderungen ........................................................................................................ 48318.2 Vorbereitungen ....................................................................................................... 48418.3 Modelinfrastruktur ................................................................................................. 48518.4 Pizza-Service einrichten ......................................................................................... 49018.5 Formulare einrichten .............................................................................................. 49418.6 Bild-Upload einrichten ........................................................................................... 49818.7 Administrationsbereich ......................................................................................... 50118.8 Ein Pizza-Karussell einrichten ............................................................................... 50219 Das Kommentar-Modul 50519.1 Anforderungen ........................................................................................................ 50519.2 Vorbereitungen ....................................................................................................... 506Inhalt1619.3 Modul-Konfiguration ............................................................................................. 50819.4 View-Helper einrichten .......................................................................................... 51119.4.1 Der View-Helper CommentShowLinks ................................................ 51119.4.2 Der View-Helper CommentShowComments ..................................... 51319.4.3 Einsatz der View-Helper ............................................................................ 51619.5 Kommentare anlegen ............................................................................................ 51919.6 Kommentar-Service erweitern ............................................................................. 52120 Das Spamabwehr-Modul 52520.1 Anforderungen ........................................................................................................ 52520.2 Vorbereitungen ....................................................................................................... 52620.3 Modul-Konfiguration ............................................................................................. 52720.4 Autoloading .............................................................................................................. 52920.5 Spamabwehr-Service .............................................................................................. 53020.6 Controller-Plugin ..................................................................................................... 53220.7 Der View-Helper SpamCheck ........................................................................... 53420.8 Spamabwehr im Kommentar-Modul nutzen .................................................... 53520.8.1 Konfiguration anpassen ............................................................................ 53620.8.2 Entitt anpassen ........................................................................................ 53720.8.3 Den Kommentar-Service anpassen .......................................................... 53720.8.4 Action-Controller anpassen ...................................................................... 53920.8.5 View-Scripts anpassen .............................................................................. 54220.9 Das Spamabwehr-Modul im Einsatz ................................................................... 54521 Das CMS-Modul 54921.1 Anforderungen ........................................................................................................ 54921.2 Vorbereitungen ....................................................................................................... 55021.2.1 Konfiguration ............................................................................................. 55121.2.2 CMS-Service ................................................................................................ 55221.2.3 Textblcke ................................................................................................... 55321.2.4 View-Helper zur Ausgabe von Textblcken ............................................ 553Inhalt1721.3 Ein Formular einrichten ......................................................................................... 55521.4 CMS-Service erweitern ......................................................................................... 55621.5 View-Helper fr das Bearbeiten erweitern ...................................................... 55821.6 JavaScript-Funktionen .......................................................................................... 56021.7 Controller einrichten ............................................................................................ 56222 Das Shop-Modul 56522.1 Anforderungen ...................................................................................................... 56522.2 Vorbereitungen ..................................................................................................... 56622.3 Modelinfrastruktur ............................................................................................... 56722.4 Bestellservice .......................................................................................................... 57322.5 Warenkorb-Service ............................................................................................... 57622.6 Controller-Plugin ................................................................................................... 58022.7 View-Helper ............................................................................................................ 58122.7.1 Der View-Helper ShowBasket ............................................................. 58122.7.2 Der View-Helper GetOrder .................................................................. 58622.8 Der Warenkorb-Controller .................................................................................. 58722.9 Warenkorb-View-Scripts ..................................................................................... 58922.10 Den Warenkorb im Pizza-Modul einsetzen ..................................................... 59322.11 Das Warenkorb-Modul im Einsatz ..................................................................... 594Anhang 599A Installation der Projektdateien ............................................................................ 601A.1 ZIP-Pakete downloaden ......................................................................... 601A.2 Dateien von GitHub klonen ................................................................... 602A.3 Installation ohne Composer .................................................................. 602A.4 Virtual Host anpassen ............................................................................. 603B Weitere Komponenten .......................................................................................... 605C Performance-Tipps .................................................................................................. 607C.1 Autoloader ClassMap .............................................................................. 607Inhalt18C.2 TemplateMap ............................................................................................ 607C.3 Die Modul-Konfiguration cachen ......................................................... 608C.4 Weitere Caches ......................................................................................... 608Index ........................................................................................................................................................ 611332Kapitel 2Neuerungen im Zend Framework 2Viele Umsteiger vom Zend Framework 1 sind besonders an den Neuerungen interes-siert, die das Zend Framework 2 mit sich bringt. Fr Umsteiger hat sich im ZF2 einigesgendert, sodass sie sich auf einen erneuten Lernaufwand einstellen mssen. DieseHrde sollte jedoch niemanden abschrecken. Wer sich einmal in die neuen Konzepteund Komponenten eingearbeitet hat, der wird sie zuknftig nicht mehr missen wol-len. Die grten Probleme treten am ehesten auf, wenn eine viel genutzte ZF1-Kom-ponente im ZF2 nicht mehr zum Framework-Kern gehrt. In solch einem Fall knnenSie bei Bedarf zumindest bergangsweise immer noch die ZF1-Komponenten ver-wenden.Dieses Kapitel fasst die wesentlichen nderungen beim Umstieg vom ZF1 auf das ZF2zusammen. Wenn Sie sich bereits mit dem ZF1 auskennen, sollten Sie sich diesesKapitel aufmerksam durchlesen. Einsteiger ins Zend Framework 2 sollten dieAbschnitte ber PHP 5.3, Git und GitHub sowie die neuen Konzepte genauer inAugenschein nehmen.Alle Listings aus diesem Kapitel finden Sie auf der buchbegleitenden Bonus-Seite.Details zur Installation finden Sie in Anhang A, Installation der Projektdateien.2.1 BegrifflichkeitenEinige Begriffe werden in diesem Buch von Beginn an sehr hufig gebraucht, auchwenn diese im ZF1 fr den Anwender nicht ganz so allgegenwrtig waren, wie sie esim ZF2 sind.Interfaces wurden bereits im ZF1 an vielen Stellen eingesetzt. Wenn Sie das ZF2 ein-setzen, kommen Sie damit hufiger in Berhrung. Ein Interface gibt vor, welcheMethoden mit welchen Parametern in einer Klasse vorhanden sein mssen, wenndiese Klasse das Interface implementiert. Fr Klassen, die von anderen Klassen ver-wendet werden, wird empfohlen, ein Interface als Basis zu erschaffen und diesesauch in den Methodensignaturen zu verwenden. Es heit also nicht:function bakePizza(Pizza $pizza)sondern:2 Neuerungen im Zend Framework 234function bakePizza(PizzaInterface $pizza)Die Aufgabe von Factories ist es, ein Objekt zu erstellen. Dabei wird nicht einfach derKonstruktor dieser Klasse aufgerufen. Sondern es wird die Factory aufgerufen, dieverschiedene Vorbereitungen trifft, um dann den Konstruktor aufzurufen. DieseVorbereitungen sind in der Regel die Bereitstellung von anderen Objekten, die derKonstruktor bei der Initialisierung bentigt. Factories knnen als Klassen, Methodenoder Closures implementiert sein.In einer Modelinfrastruktur kann es verschiedene Bestandteile geben. Eine Entittstellt dabei ein einfaches Objekt, wie z. B. eine Pizza, ein Buch oder einen Blogbeitragdar. Eine Datenquelle ist dafr zustndig, die Daten fr eine Entitt aus einer Daten-bank oder einer anderen Datenquelle zu lesen. Um die Daten aus einer Datenquellean eine Entitt zu bergeben, bedarf es eines Mappers. Ein Hydrator ist ebenfalls eineArt Mapper, der Daten eines Arrays an ein Objekt bergeben kann und umgekehrt.Ein Model-Service hlt alles zusammen. Er kommuniziert mit Datenquellen undMappern, verarbeitet Entitten, setzt Hydratoren ein und stellt eine Schnittstellebereit, damit Controller auf die Modelinfrastruktur zugreifen knnen.2.2 PHP-VersionDie augenscheinlichste Neuerung ist der Wechsel auf PHP 5.3 als Mindestanforde-rung fr das Zend Framework 2. Setzte das Zend Framework 1 noch PHP 5.2 voraus, sokonnten durch den Umstieg auf PHP 5.3 eine Vielzahl neuer Funktionen genutzt wer-den. Der Zend Framework 2-Nutzer kommt am ehesten mit dem Einsatz vonNamensrumen und der Verwendung von Closures in Berhrung. Das Zend Frame-work 2 macht aber auch regen Gebrauch vom Late Static Binding. Trotz allem solltenSie neue Projekte am besten gleich auf PHP 5.4 aufsetzen, da auch PHP 5.3 langsam indie Jahre gekommen ist.2.2.1 PHP-NamespacesIn PHP 5.2 wurden keine Namensrume untersttzt. Deshalb wurden im Zend Frame-work 1 knstliche Namensrume geschaffen, um die Klassen auf die Dateiebeneabbilden zu knnen. Ein Beispiel: Die Klasse Zend_Loader_Autoloader ist im ZendFramework 1 in der Datei /library/Zend/Loader/Autoloader.php abgelegt. Durchdiese knstlichen Namensrume wird sichergestellt, dass es nicht zu Namenskollisi-onen mit anderen Autoloader-Klassen aus anderen Bibliotheken kommt.PHP 5.3 bietet echte Namensrume, sodass im Zend Framework 2 das Abbilden vonKlassen auf Dateiebene vereinfacht wird. Die neue Klasse StandardAutoloader gehrt2.2 PHP-Version352zum Namensraum Zend\Loader und befindet sich somit in der Datei /library/Zend/Loader/StandardAutoloader.php.Ein anderes Beispiel soll eine weitere Neuerung verdeutlichen: Im Zend Framework 1befindet sich die Klasse Zend_Config in der Datei /library/Zend/Config.php. Im ZendFramework 2 drfen im /library/Zend/-Verzeichnis keine Dateien liegen. Die quiva-lente Klasse Config gehrt somit zum Namensraum Zend\Config und befindet sich inder Datei /library/Zend/Config/Config.php.In Listing 2.1 ist auszugsweise die besagte Klasse Config zu sehen. Oben wird mit demSchlsselwort namespace der Namensraum definiert, zu dem die Klasse gehrt. Mit-hilfe des Schlsselwortes use werden andere Namensrume importiert, damit Klas-sen und Interfaces aus diesen Namensrumen in unserer Klasse verwendet werdenknnen. Bei den Namensrumen ArrayAccess, Countable und Iterator handelt essich brigens um Namensrume, die von PHP 5.3 direkt bereitgestellt werden.namespace Zend\Config;use ArrayAccess;use Countable;use Iterator;class Config implements Countable, Iterator, ArrayAccess{// do whatever}Listing 2.1 Namensraum-Deklaration fr die Config-KlasseDie Verwendung der Namensrume ist jedoch nicht auf die Zend Framework 2-Biblio-thek beschrnkt. Auch in den Klassen und Anwendungsmodulen knnen und solltenEntwickler Namensrume definieren (zum Thema Modularitt siehe Abschnitt 2.4.1,Verbesserte Modularitt).In Listing 2.2 ist ein Action-Controller aus einem Application-Modul zu sehen. DieserKlasse wurde der Namensraum Application\Controller zugewiesen. Die Klasseimportiert vier Namensrume, von denen zwei zur Zend Framework 2-Bibliothekgehren und die beiden anderen zu einem Blog-Modul. Mithilfe des Schlsselwortsas kann einem Namensraum auch ein Alias gegeben werden. Dies ist erforderlich, daes ansonsten zwischen den beiden Klassen Blog\Service\Blog und Blog\Options\Blog zu Namenskollisionen kommen knnte.namespace Application\Controller;use Zend\Mvc\Controller\AbstractActionController;2 Neuerungen im Zend Framework 236use Zend\View\Model\ViewModel;use Blog\Service\Blog as BlogService;use Blog\Options\Blog as BlogOptions;class IndexController extends AbstractActionController{}Listing 2.2 Namensraum-Deklaration fr einen Action-ControllerZF1-Umsteiger und ZF2-Einsteiger werden gleichermaen die Vorteile der Namens-rume schnell zu schtzen wissen und ihre Anwendung darauf aufbauen wollen.2.2.2 ClosuresEine Closure ist eine anonyme Funktion, die z. B. einer Variable zugeordnet werdenkann. Sie wird als anonym bezeichnet, da diese Funktion keinen Namen hat, durchden sie aufgerufen werden knnte.Listing 2.3 zeigt ein einfaches Beispiel. Der Variablen $pizzaPrice wird eine Closurezugewiesen. Diese Funktion nimmt die Anzahl der Zutaten entgegen und ermitteltdamit den Preis einer Pizza, indem zu einem Grundpreis nochmals der Preis proZutat hinzuaddiert wird. Der Aufruf dieser Closure erfolgt dann direkt ber die Vari-able $pizzaPrice, die als Funktion verwendet werden kann.$pizzaPrice = function($items) {return 3.95 + $items * 0.95;};echo $pizzaPrice(3); // output 6.8echo $pizzaPrice(7); // output 10.6Listing 2.3 Beispiel fr eine einfache Closure-DefinitionEine Closure kann aber beim Aufruf nicht nur variable Parameter bergeben bekom-men. Es ist auch mglich, bei der Definition Variablen mithilfe des Schlsselwortesuse zu bergeben, die dann als fixe Werte verwendet werden knnen. Listing 2.4 zeigtdas genderte Beispiel, bei dem die Werte fr den Grundpreis und den Preis pro Zutatbei der Definition der Funktion bergeben werden:$basePrice = 3.95;$itemPrice = 0.95;$pizzaPrice = function($items) use ($basePrice, $itemPrice) {return $basePrice + $items * $itemPrice;2.2 PHP-Version372};echo $pizzaPrice(2); // output 5.85echo $pizzaPrice(6); // output 9.65Listing 2.4 Beispiel fr eine Closure-Definition mit bergebenen VariablenClosures knnen aber nicht nur an Variablen bergeben werden, sondern auch alsParameter an andere Funktionen oder Klassenmethoden bergeben werden. In Lis-ting 2.5 werden zuerst einige Pizza-Klassen definiert sowie eine Sammlung von Pizza-Objekten erstellt. Um nur die Salami-Pizzen auszufiltern, wird das Objekt $pizzaListan die array_filter()-Methode bergeben. Zudem wird eine Closure als Callback-Funktion bergeben, die true zurckgibt, wenn der Wert eine Instanz von Pizza-Salami ist, und andernfalls false. Bei der Ausgabe werden nur die beiden Instanzenvon PizzaSalami ausgegeben, und die anderen Pizzen werden ausgefiltert.class PizzaSalami {}class PizzaHawaii {}class PizzaMelon {}$pizzaList = array(new PizzaSalami(),new PizzaHawaii(),new PizzaMelon(),new PizzaSalami());$pizzaSalamiOnly = array_filter($pizzaList, function($val) {return ($val instanceof PizzaSalami);});var_dump($pizzaSalamiOnly);Listing 2.5 Beispiel fr eine Closure-Definition als Parameter einer FunktionSomit knnen wir Closures auch fr alle PHP-Funktionen verwenden, die eine Call-back-Funktion als Parameter erwarten. Neben der verwendeten array_filter()-Funktion wren das z. B. auch call_user_func() oder usort().Zend Framework 2-Nutzer verwenden Closures am ehesten bei der Definition vonFactories fr den Service-Manager (siehe Abschnitt 6.1, Zend\ServiceManager).2 Neuerungen im Zend Framework 2382.2.3 Late Static BindingDie Methodik das Late Static Binding (spte statische Bindung) lst ein Problem beierweiterten Klassen mit statischen Methoden und Eigenschaften, das in Listing 2.6demonstriert wird. Die Klasse PizzaSalami definiert drei Methoden. Die MethodegetNameSelf() greift ber das Schlsselwort self auf die Methode name() zu, whrenddie Methode getNameStatic() das Schlsselwort static verwendet. Die Klasse Pizza-SalamiPeperoni erweitert die Klasse PizzaSalami und berschreibt die Methodename(). Der Unterschied in der Funktionsweise tritt beim Aufruf der Methode Pizza-SalamiPeperoni::getNameStatic() am Ende des Listings auf. Dort wird nmlich derrichtige Name der PizzaSalamiPeperoni ausgegeben. Dieses Verhalten war in PHP 5.2nicht mglich und hat vielen Entwicklern einiges Kopfzerbrechen bereitet.class PizzaSalami {public static function getNameSelf() {return self::name();}public static function getNameStatic() {return static::name();}public static function name() {return 'Pizza mit Salami';}}class PizzaSalamiPeperoni extends PizzaSalami {public static function name() {return 'Pizza mit Salami und Peperoni';}}echo PizzaSalami::getNameSelf();echo PizzaSalami::getNameStatic();echo PizzaSalamiPeperoni::getNameSelf();echo PizzaSalamiPeperoni::getNameStatic();Listing 2.6 Beispiel fr Late Static BindingDie Methodik des Late Static Binding wird in der Zend Framework 2-Bibliothek rechthufig verwendet. Als Nutzer des Zend Framework 2 kommen Sie damit nur inBerhrung, wenn Sie es in ihren eigenen Klassen verwenden mchten.2.3 Git und GitHub3922.3 Git und GitHubEine technische Umstellung, die vorwiegend die Zend Framework 2-Entwicklerbetrifft, ist der Wechsel von Subversion (SVN) zu Git. Bei SVN und Git handelt es sichum Software fr die Versionsverwaltung von Dateien. Das Zend Framework 1 hat vonBeginn an auf SVN gesetzt. Fr das Zend Framework 2 wurde frhzeitig entschieden,sich die Vorteile von Git fr die Entwicklung des ZF2 zunutze zu machen. Doch wiesokam es dazu?Das Zend-Framework-Team versprach sich von dem Wechsel eine verbesserte Pro-duktivitt, sodass Patches und Verbesserungsvorschlge der Framework-Anwenderschneller eingepflegt werden knnen. Die Erfahrung der letzten Jahre in der Entwick-lung vom Zend Framework 2 hat diese Hoffnung mehr als besttigt. Mittlerweile istauch der Issue Tracker, in dem Anwender Bugs und Feature Requests einstellen kn-nen, auch zu GitHub gewechselt. Somit liegen die wichtigsten Entwicklungstools nunauf einer Plattform und sind nicht ber mehrere Tools verteilt.Git gibt es fr alle wichtigen Betriebssysteme wie Linux, Windows und Mac OS X(http://git-scm.com/). Wenn Sie eine Anwendung mit dem Zend Framework erstel-len mchten, mssen Sie fr Ihre Versionsverwaltung nicht unbedingt auch zu Gitwechseln. Es ist aber dennoch hilfreich, wenn auf Ihrem Entwicklungsrechner auchGit zur Verfgung steht, da dies die Installationen der SkeletonApplication (sieheAbschnitt 3.3, SkeletonApplication installieren) sowie von Fremdmodulen verein-fachen kann.Bei GitHub handelt es sich um einen webbasierten Hosting-Dienst fr Softwarepro-jekte (https://github.com/). Dort kann jeder Entwickler eigene ffentliche Reposito-ries fr seine Softwareprojekte anlegen und pflegen oder bestehende kopieren, umsie an eigene Bedrfnisse anzupassen.Nicht nur das Zend Framework 2 wird in einem Repository auf GitHub gepflegt (siehehttps://github.com/zendframework/). Auch viele ZF2-Fremdmodule sind dort zu fin-den; als Beispiel seien die Module der ZF-Commons-Initiative genannt (siehe https://github.com/ZF-Commons).Wer sich mit Git und GitHub noch nicht auskennt, der braucht keine Angst zu haben,auer mit dem neuen Zend Framework 2 auch noch Stunden mit dem Lernen von Gitund GitHub verbringen zu mssen. Mit folgenden Links gelingt der Einstieg auchAnfngern: http://try.github.com/Ein schn gemachtes, interaktives Tutorial fr den allgemeinen Einstieg in Git undGitHub2 Neuerungen im Zend Framework 240 http://framework.zend.com/wiki/x/vYFZAQIm Zend Framework 2-Wiki gibt es einen Git Guide, mit dem sich der Entwicklermit den wichtigsten Befehlen und Funktionen von Git und GitHub vertrautmachen kann. http://de.gitready.com/Die Website bietet viele Tipps und Tricks auf Deutsch zum Lernen von Git auchfr fortgeschrittene Themen.Im weiteren Verlauf des Buches werden wir bei der Installation der SkeletonApplica-tion und bei Fremdmodulen sowie beim Einrichten eigener Repositories auf diegrundlegenden Befehle und Funktionen von Git nher eingehen.2.4 Neue KonzepteIm Zend Framework 2 wurde eine Vielzahl neuer Konzepte implementiert, die imZend Framework 1 noch nicht oder nur teilweise umgesetzt waren. Diese Konzeptewurden nicht von den Zend Framework 2-Entwicklern erfunden, sondern werdenschon lnger in der Softwareentwicklung eingesetzt. Neu ist der Einsatz im ZF2.Mithilfe dieser Konzepte wurde die Entwicklung von Zend Framework 2-Anwendun-gen noch einmal um ein Vielfaches vereinfacht. Einsteiger und Umsteiger mssendiese Lernkurve jedoch erst einmal erklimmen. Sobald Sie aber die Konzepte verstan-den und verinnerlicht haben, werden Sie diese in Zukunft nicht mehr missen wollen.Die Konzepte werden in diesem Abschnitt unabhngig vom Zend Framework 2 erlu-tert. Auf die konkreten Zend Framework 2-Implementierungen wird entsprechendverwiesen.2.4.1 Verbesserte ModularittIm Zend Framework 1 gab es bereits Module. Doch diese waren eher Brger zweiterKlasse (second-class citizens). Die Konfiguration der Module war mhsam, und einAustausch von Modulen zwischen mehreren Anwendungen war aufgrund vonAbhngigkeiten nicht ohne Weiteres mglich. Im Wesentlichen waren Module imZF1 nur Container fr Action-Controller, View-Scripts und fr weitere Klassen desModuls.Im Zend Framework 2 sind die Module nun Brger erster Klasse. Das bedeutet, dassim Prinzip alles ein Modul ist. Selbst die Zend Framework 2-Bibliothek kann alsModul betrachtet werden. Somit braucht jede Zend Framework 2-Anwendung immermindestens ein Anwendungsmodul, das aber vom Entwickler vollkommen frei kon-figuriert werden kann. Dies bringt viele Freiheiten, bedeutet aber auch einen gewis-sen Aufwand bei der Einrichtung einer neuen Zend Framework 2-Anwendung.2.4 Neue Konzepte412Somit kann eine Zend Framework 2-Anwendung verschiedene Anwendungsmodulewie ein Blog, einen Shop oder ein Kommentarmodul einsetzen. Und Sie knnen dieseModule in der Regel mit vertretbarem Aufwand in anderen Zend Framework 2-Anwendungen ebenfalls einsetzen.Zustzlich gibt es eine Vielzahl an ZF2-Fremdmodulen, die Sie in Ihre Projekte inte-grieren knnen. Diese Module bieten Benutzermanagement, Doctrine 2-Integration,Twitter Bootstrap-Untersttzung, Asset-Management und vieles mehr.In Kapitel 7, Der Modul-Manager, wird die Implementation der neuen Modularittdetailliert erlutert. Auch die Entwicklung von Anwendungsmodulen und die Instal-lation von Fremdmodulen werden anhand praktischer Beispiele beleuchtet.2.4.2 Dependency InjectionDer Begriff der Dependency Injection definiert ein Entwurfsmuster, das die Steue-rung der Abhngigkeiten zwischen Objekten lst. Ohne Dependency Injection wer-den Abhngigkeiten von Objekten meistens hart codiert in den Code aufgenommen.Listing 2.7 demonstriert ein Beispiel mit festen Abhngigkeiten. Diese Pizza Salamiwird mit den drei festen Belgen Salami, Kse und Tomatenpampe belegt, und derPizzaboden ist aus Weizenmehl gemacht. Mchte ein Kunde nun doppelt Kse, Elch-salami oder einen Pizzaboden aus Dinkelmehl, kann Luigi diese Wnsche nicht imSystem abbilden.class PizzaSalami{public function __construct(){$this->crust = new CrustWheatFlour();$this->toppings = array(new ToppingSalami(),new ToppingCheese(),new ToppingTomatoStodge(),);}}$pizzaSalami = new PizzaSalami();var_dump($pizzaSalami);Listing 2.7 Klasse fr eine Pizza Salami mit festen Belgen und Pizzaboden2 Neuerungen im Zend Framework 242Die Lsung fr das Problem der hart codierten Abhngigkeiten ist in Listing 2.8 zusehen. Der Konstruktor nimmt einen Parameter entgegen, der das CrustInterfaceimplementiert. Wenn unsere Klassen CrustWheatFlour und CrustSpeltFlour diesesInterface implementieren, sind wir flexibel beim Austausch des Pizzabodens. Anstattdie Belge in einem Array an den Konstruktor zu bergeben, wurde eine eigeneMethode addTopping() implementiert. Diese Methode nimmt einen Parameter ent-gegen, der das ToppingInterface implementieren muss. Somit knnen wir nicht nurdie Belge selber, sondern auch die Anzahl der Belge bequem variieren. Am Endedes Listings wird unsere Pizza Salami instanziiert. Dabei wird unser Pizzaboden ausWeizenmehl bergeben, und danach werden die Belge hinzugefgt. Auch die Spezi-alpizza mit Elchsalami, doppelt Kse und einem Pizzaboden aus Dinkelmehl ist nunkein Problem mehr.class Pizza{public function __construct(CrustInterface $crust){$this->crust = $crust;}public function addTopping(ToppingInterface $topping){$this->toppings[] = $topping;}}$pizzaSalami = new Pizza(new CrustWheatFlour());$pizzaSalami->addTopping(new ToppingSalami());$pizzaSalami->addTopping(new ToppingCheese());$pizzaSalami->addTopping(new ToppingTomatoStodge());$pizzaSpeciale = new Pizza(new CrustSpeltFlour());$pizzaSpeciale->addTopping(new ToppingElkSalami());$pizzaSpeciale->addTopping(new ToppingCheese());$pizzaSpeciale->addTopping(new ToppingCheese());$pizzaSpeciale->addTopping(new ToppingTomatoStodge());Listing 2.8 Klasse fr Pizza mit variablen Belgen und variablem PizzabodenDiese Vorgehensweise ist nicht nur beim Belegen von Pizzen hilfreich. Auch das Tes-ten der Anwendung wird dadurch stark vereinfacht. Denn solange unsere Belge dasInterface ToppingInterface implementieren, knnen wir diese Klasse auch mit Mock-Objekten (Dummy-Objekten oder Attrappen) befllen. Solange Luigi am Ende keine2.4 Neue Konzepte432Pizza mit Gel-Schinken und Kunst-Kse ausliefert, kann das Mocken der Belge beimTesten durchaus akzeptabel und sinnvoll sein.In Abschnitt 6.2, Zend\Di, wird die Zend Framework 2-Implementation des Ent-wurfsmusters Dependency Injection ausfhrlich dargestellt.2.4.3 Service-LocatorWer im Zend Framework 1 gerne und viel mit der Zend_Registry gearbeitet hat, derwird berrascht sein. Im Zend Framework 2 gibt es keine zentrale Registry mehr, inder Sie nach Lust und Laune ihre Objekte und Daten ablegen knnen. Das ZendFramework 2 stellt aber etwas viel Besseres bereit: den Service-Locator. Beim Service-Locator handelt es sich auch um ein Entwurfsmuster fr eine zentrale Registrierungvon Objekten zur spteren Nutzung. Es funktioniert hnlich wie die Registry, nurdass sich der Service-Locator auch um die Instanziierung der Objekte kmmert.In Listing 2.9 wird das Prinzip des Service-Locators mit einer eigenen Implementa-tion dargestellt. Die Klasse ServiceLocator verfgt ber drei Methoden zum Initiali-sieren, Hinzufgen und Holen von Services. Die Methode set() nimmt einenBezeichner und den Namen der Klasse entgegen, instanziiert die Klasse und legt siefr den spteren Zugriff ab. Die Methode get() gibt mithilfe des Bezeichners dieInstanz zurck. Unter der Klassendeklaration wird der ServiceLocator zuerst mit dennotwendigen Services gefttert. Am Ende des Listings wird unsere Salamipizza mitPizzaboden und Belgen erstellt, die aus dem Service-Locator geholt und nicht direktinstanziiert werden.class ServiceLocator{protected $services = array();public function set($id, $className){$this->services[$id] = new $className();}public function get($id){return $this->services[$id];}}$sl = new ServiceLocator();$sl->set('wheat-crust', 'CrustWheatFlour');$sl->set('salami', 'ToppingSalami');2 Neuerungen im Zend Framework 244$sl->set('cheese', 'ToppingCheese');$sl->set('tomato-stodge', 'ToppingTomatoStodge');$pizzaSalami = new Pizza($sl->get('wheat-crust'));$pizzaSalami->addTopping($sl->get('salami'));$pizzaSalami->addTopping($sl->get('cheese'));$pizzaSalami->addTopping($sl->get('tomato-stodge'));Listing 2.9 Einfache Implementierung eines Service-LocatorsWie oben erwhnt wurde, ist dieses Beispiel funktional stark reduziert, und der Mehr-aufwand mag auf den ersten Blick zu viel des Guten sein. Dies liegt vor allem daran,dass die Services, die wir ablegen, nur einfache Objekte ohne Methoden sind. DenkenSie statt an Kse und Salami einmal an komplexere Services fr Authentifizierung,Mailversand oder Logging. Diese Objekte werden wiederum andere Objekte fr dieInstanziierung bentigen, die wiederum andere Objekte bentigen. Statt eines einfa-chen Klassennamens kann ein Service-Locator (wie im nchsten Beispiel zu sehen)auch eine Closure bergeben bekommen, die sich um die Instanziierung der Objektekmmert.Listing 2.10 zeigt den genderten Service-Locator, an dem nur die set()-Methode ver-ndert wurde. Statt eines Strings nimmt sie nun eine Instanz des Closure-Objektsentgegen. Der Service wird angelegt, indem die Closure ausgefhrt wird. Weiterunten wird die Closure-Methode definiert und an die Variable $factoryClosure ber-geben. In der Funktion wird unsere Pizza auf dem klassischen Weg instanziiert undbelegt. Diese Closure-Funktion wird nun an das ServiceLocator-Objekt bergebenund dabei ausgefhrt. Zum Abschluss wird die Instanz vom Service-Locator angefor-dert und ausgegeben. Wir erhalten dabei eine Instanz von Pizza mit Salami, Kse undTomatenpampe zurck.class ServiceLocator{public function __construct(){$this->services = array();}public function set($id, Closure $closure){$this->services[$id] = $closure();}public function get($id){return $this->services[$id];}2.4 Neue Konzepte452}$factoryClosure = function() {$pizzaSalami = new Pizza(new CrustWheatFlour());$pizzaSalami->addTopping(new ToppingSalami());$pizzaSalami->addTopping(new ToppingCheese());$pizzaSalami->addTopping(new ToppingTomatoStodge());return $pizzaSalami;};$sl = new ServiceLocator();$sl->set('pizza-salami', $factoryClosure);var_dump($sl->get('pizza-salami'));Listing 2.10 Implementation eines Service-Locators mit ClosuresEin Service-Locator knnte neben Klassennamen und Closures auch andere Parame-ter fr die Instanziierung der Objekte verarbeiten, was die Flexbilitt und die Testbar-keit erhhen wrde. So wren Factory-Klassen denkbar, deren Aufgabe es ist, einObjekt einer Klasse zu instanziieren und zurckzuliefern.In Abschnitt 6.1, Zend\ServiceManager, wird die Zend Framework 2-Implementa-tion des Service-Locator-Entwurfsmusters und deren Konfiguration mit Beispielenerlutert.2.4.4 Ereignisgesteuerte ArchitekturBei der ereignisgesteuerten Architektur (event-driven architecture) handelt es sichum ein weiteres Entwurfsmuster, das im Zend Framework 2 neu implementiertwurde. Bei diesem Prinzip wird die Interaktion von lose gekoppelten Komponentendurch Ereignisse (Events) gesteuert.Fr eine beispielhafte Implementation bentigen wir einen Event-Manager, der auchals Event-Dispatcher bezeichnet wird. Dessen Aufgabe ist es, eine Reihe von Event-Listenern zu verwalten. Diese Listener warten darauf, dass ein Ereignis angestoenwird (to trigger an event). Wird das Ereignis angestoen, so knnen die Aufgabenausgefhrt werden.Fr unser nchstes Beispiel stellen wir uns den Eingang einer Pizzabestellung vor.Sobald die neue Bestellung gespeichert wird, muss eine Reihe von Aufgaben erledigtwerden. Diese Aufgaben knnten der Versand einer Bestellbesttigung, die Aktuali-sierung des Warenbestands und das Backen der Pizza sein. Vor dem Speichern derBestellung knnte zudem der Warenbestand geprft werden.2 Neuerungen im Zend Framework 246Listing 2.11 zeigt ein kompaktes Beispiel fr einen Event-Manager. Zuerst wird dasInterface EventListener definiert, das von einer Reihe von Klassen implementiertwird. Die Klassen SendConfirmation, UpdateStock und BakePizza implementieren dieMethode postOrder(). Die Klasse CheckStock implementiert die Methode preOrder().Zustzlich bentigen wir noch eine Klasse fr die Bestellung der Pizza. Den Kern stelltdie Klasse EventManager dar. Mithilfe der Methode attach() knnen die definiertenListener fr ein entsprechendes Ereignis hinzugefgt werden. Zudem steht dieMethode trigger() bereit, um die Ereignisse bei den registrierten Listenern ausfh-ren zu lassen.interface EventListener {}class SendConfirmation implements EventListener {public function postOrder(){echo "Send order confirmation";}}class UpdateStock implements EventListener {public function postOrder(){echo "Update stock";}}class BakePizza implements EventListener {public function postOrder(){echo "Bake the pizza";}}class CheckStock implements EventListener {public function preOrder(){echo "Check stock";}}class PizzaOrder{public function __construct(){echo "Save order";}2.4 Neue Konzepte472}class EventManager{protected $listeners = array();public function attach($event, EventListener $listener){$this->listeners[$event][] = $listener;}public function trigger($event){foreach ($this->listeners[$event] as $listener) {$listener->$event();}}}$em = new EventManager();$em->attach('postOrder', new SendConfirmation());$em->attach('postOrder', new BakePizza());$em->attach('postOrder', new UpdateStock());$em->attach('preOrder', new CheckStock());$em->trigger('preOrder');$pizzaOrder = new PizzaOrder();$em->trigger('postOrder');Listing 2.11 Beispiel fr einen Event-ManagerDanach wird der Event-Manager instanziiert, und die Listener werden fr die Ereig-nisse hinzugefgt. Entscheidend fr die Ausfhrung eines Listeners ist die Reihen-folge, in der die Listener hinzugefgt wurden. Danach kann es endlich losgehen.Zuerst wird das Ereignis preOrder ausgelst, danach wird die Bestellung erstellt undzum Schluss das Ereignis postOrder ausgelst. Die Ausgabe erfolgt in dieser Reihen-folge:Check stockSave orderSend order confirmationBake the pizzaUpdate stock2 Neuerungen im Zend Framework 248Natrlich ist dieser Event-Manager recht primitiv. Listener mssten auch entferntwerden knnen. Zudem wre eine frei definierbare Reihenfolge fr die Ausfhrungder Listener beim Auslsen eines Ereignisses sinnvoll. Wir knnten weitere Inter-faces erstellen, die das Vorhandensein von preOrder()- und postOrder()-Methodenvorschreiben. Auerdem sollte nach einer fehlerhaften Prfung des Bestandes durcheine Exception der gesamte Prozess beendet werden, damit die Bestellung nichtgespeichert wird.In Kapitel 5, Der Event-Manager, wird die Zend Framework 2-Implementation desEvent-Managers ausfhrlich dargelegt und mit Beispielen versehen. brigens wurdeder Event-Manager mittlerweile auch in das Zend Framework 1.12 zurckportiert.2.5 KomponentenvergleichDer Groteil der Komponenten, die es bereits im Zend Framework 1 gegeben hat, fin-det sich auch weiterhin im Zend Framework 2 wieder. Manche Komponenten wur-den nur leicht berarbeitet, andere wiederum von Grund auf neu entwickelt; wiederandere fielen ganz weg oder gehren nicht mehr zum Kern des Zend Framework 2.Tabelle 2.1 zeigt alle ZF2-Komponenten, die es bereits im Zend Framework 1 gegebenhat. Zend_Auth ist in Zend\Authentication umbenannt worden, und aus Zend_Con-troller wurde Zend\Mvc. Die Komponente Zend_Acl wurde nach Zend\Permissions\Acl verschoben. Wenn Sie bisher diese Komponenten reichlich genutzt haben, kn-nen Sie auch weiterhin darauf bauen, auch wenn sich die Benutzung dieser Kompo-nenten zum Teil gravierend gendert hat.Zend\Authentication Zend\Http Zend\ProgressbarZend\Barcode Zend\InputFilter Zend\SerializerZend\Cache Zend\Json Zend\ServerZend\Captcha Zend\Ldap Zend\SessionZend\Console Zend\Loader Zend\SoapZend\Code Zend\Log Zend\TagZend\Config Zend\Mail Zend\TextZend\Db Zend\Memory Zend\UriZend\Debug Zend\Mime Zend\ValidatorTabelle 2.1 Alte ZF1-Komponenten im neuen Gewand (Stand: ZF 2.2.0)2.5 Komponentenvergleich492In Tabelle 2.2 sind alle diejenigen Komponenten aufgelistet, die im Zend Framework 2komplett neu hinzugekommen sind. Dabei stellt Zend\I18n eine Besonderheit dar. ImZend Framework 1 gab es mit Zend_Date, Zend_Locale, Zend_Translate und andereneinen bunten Strau an Komponenten fr die Internationalisierung (i18n) undLokalisierung (l10n) von Webanwendungen. Da PHP 5.3 jedoch eigene Funktiona-litten fr die Internationalisierung und Lokalisierung bietet, konnten diese Kompo-nenten stark reduziert werden. Das Ergebnis ist die Komponente Zend\I18n, dieweiterhin einen Translator sowie Filter und Validatoren fr die Internationalisierungund Lokalisierung bereitstellt.Tabelle 2.3 listet alle Komponenten auf, die es nicht mehr in den Kern des ZendFramework geschafft haben. Alle mit einem (I18n) markierten Komponentenwurden wie oben erwhnt in der neuen Komponente Zend\I18n zusammengefasst.Fr die Komponenten mit einem (GH) wurden auf GitHub eigene Repositorieseingerichtet (https://github.com/zendframework). Die ZF-Community ist dazu auf-gerufen, sich dieser Komponenten anzunehmen und sie zuknftig weiterzuentwi-ckeln. Das Zend Framework-Kernteam kann diese Arbeit zuknftig nicht mehr ber-nehmen.Zend\Dom Zend\Mvc Zend\VersionZend\Feed Zend\Navigation Zend\ViewZend\Filter Zend\Paginator Zend\XmlRpcZend\Form Zend\Permissions\AclZend\Crypt Zend\EventManager Zend\ModuleManagerZend\Di Zend\I18n Zend\ServiceManagerZend\Escaper Zend\Math Zend\StdlibTabelle 2.2 Neue ZF2-Komponenten mit neuem Glanz (Stand: ZF 2.2.0)Zend_Amf (GH) Zend_Markup (GH) Zend_Search_Lucene (GH)Zend_Cloud (GH) Zend_Measure (I18n) Zend_Service (GH)Zend_Currency (I18n) Zend_OAuth (GH) Zend_TestTabelle 2.3 Der traurige Rest: vergessen, verraten und verkauft (Stand: ZF 2.2.0)Tabelle 2.1 Alte ZF1-Komponenten im neuen Gewand (Stand: ZF 2.2.0) (Forts.)2 Neuerungen im Zend Framework 250Diese Liste ist interessant, da Komponenten wie Zend_Search_Lucene und Zend_Pdf inder Anfangszeit groes Interesse in der PHP-Community hervorgerufen haben undso manchen Entwickler erst zum Zend Framework 1 gebracht haben. Die Zeit hatjedoch bei beiden Komponenten schnell gezeigt, dass sie aus Performance-Grndenoder wegen fehlender Funktionen in der Praxis nur schwer einsetzbar waren.Andere Komponenten, wie Zend_Amf, Zend_Gdata oder Zend_InfoCard, sind so speziell,dass sie nicht mehr zum Framework-Kern gehren. Auch die Webservice-Kompo-nenten aus Zend_Service gehren nicht mehr zum Kern vom ZF2.Das gleiche Schicksal teilen die beiden Komponenten Zend_Dojo und ZendX_JQuery,die Untersttzung fr JavaScript-Bibliotheken geboten haben (wobei speziell ZendX_JQuery nie zum Kern des Zend Framework 1 gezhlt hat). Wer Untersttzung fr Dojound jQuery sucht, wird zuknftig auf spezielle Fremdmodule hoffen mssen.Die Fokussierung auf weniger Kernkomponenten ist ein groes Plus fr das ZendFramework 2. Dadurch werden die Kapazitten besser auf die wesentlichen Kompo-nenten konzentriert und das Problem mit Komponenten, die nicht oder nur kaumgepflegt werden, hat sich damit auch gelst.2.6 Vor- und Nachteile des ZF2Wer vom Zend Framework 1 auf das Zend Framework 2 umsteigt, kommt in denGenuss einiger wesentlicher Vorteile: Ein wichtiges Feature des Zend Framework 2 ist die neue Modularitt, die den Aus-tausch von Modulen zwischen Anwendungen sowie die Konfiguration derModule stark vereinfacht. Zudem gibt es bereits ein groes Angebot an wiederver-wendbaren Fremdmodulen, und nahezu tglich kommen mehr dazu. Diese frem-den Module lassen sich in der Regel leicht installieren und bei Bedarf auchanpassen.Zend_Date (I18n) Zend_OpenId (GH) Zend_TimeSync (GH)Zend_Dojo Zend_Pdf (GH) Zend_Tool (GH)Zend\File Zend_Queue (GH) Zend_Translate (I18n)Zend_Gdata (GH) Zend_Reflection Zend_WildfireZend_InfoCard Zend_RegistryZend_Locale (I18n) Zend_Rest (GH)Tabelle 2.3 Der traurige Rest: vergessen, verraten und verkauft (Stand: ZF 2.2.0) (Forts.)2.6 Vor- und Nachteile des ZF2512 Das Zend Framework 1 bot ein hohes Ma an Flexibilitt. Mit dem Zend Frame-work 2 konnten diese Freiheiten nochmals erweitert werden. Gab es im ZF1 festge-legte Konventionen, an die Sie sich halten mussten, damit Ihre Anwendungproblemlos lief, so knnen Sie im ZF2 viele Funktionalitten selber konfigurieren.Es gibt zwar immer noch Empfehlungen, an die Sie sich halten sollten. Aber Siehaben auch mehr Freiheiten. Waren im Zend Framework 1 noch viele Komponenten eng miteinander verzahnt,so wurde die lose Kopplung der Komponenten mit dem Zend Framework 2 starkvorangetrieben. Einige Komponenten wie Zend\Form und Zend\View, die im ZF1eine Vielzahl an Aufgaben bernommen hatten, wurden stark entkoppelt. Selbstdas Zusammenspiel der Zend\Mvc-Komponenten lsst sich so weit aufbohren, dassSie den gesamten Prozess der Model-View-Controller-Verarbeitung umgestaltenknnen. Die neuen Konzepte Dependency Injection, Service-Locator und Event-Managerentfalten ihr groes Potenzial, sobald Sie diese verinnerlicht haben und tglichanwenden. Wenn Sie die Lernkurve erst einmal erklommen haben, werden Sieungern zum Zend Framework 1 zurckkehren wollen. Neu beim ZF2 ist auch die Mglichkeit, nur die Komponenten zu installieren, dieSie brauchen. Sie sind nicht gezwungen, das gesamte Framework herunterzula-den. Fr die Installation stehen zudem mehrere Wege (u.a. Composer, Pyrus) zurAuswahl. Wie beim ZF1 sind Sie auch beim ZF2 nicht gezwungen, das gesamte Frameworkfr Ihre Anwendung zu nutzen. Sie knnen das Zend Framework somit als GlueFramework einsetzen. Auf der anderen Seite knnen Sie das Zend Framework auchals Full-Stack Framework verwenden und damit komplette Projekte umsetzen. Das gesamte Framework ist mit einer soliden Testbasis ausgestattet. Keine Kom-ponente wird fr den Kern akzeptiert, wenn die Funktionalitten nicht mit ausrei-chend und fehlerfreien Unit-Tests ausgestattet sind. Wer sich beim ZF1 einbringen wollte, um neue Features beizusteuern, Bugs zufixen oder die Dokumentation zu bersetzen, musste zwingend ein CLA (Contri-butor License Agreement) unterzeichnen und an die Firma Zend faxen. DieseHrde fllt mit dem Zend Framework 2 weg.Es gibt auch einige Nachteile beim Einsatz des Zend Frameworks 2, die gerade zuBeginn und bei der Einarbeitung eine groe Hrde darstellen. Diese sollen nicht ver-schwiegen werden, auch wenn sie mit wachsender Erfahrung keine Hindernissemehr darstellen werden. Die Konfigurationslastigkeit kann auf den ersten Blick abschrecken. Da es fr vieleDinge keine festen Konventionen mehr gibt, mssen Sie diese selber konfigurie-ren. Die SkeletonApplication, die Sie in Abschnitt 3.3, SkeletonApplication instal-2 Neuerungen im Zend Framework 252lieren, kennenlernen werden, nimmt Ihnen zwar einiges an Arbeit ab. Dennochmssen Sie fr Ihre Anwendungsmodule die Routen, die Controller, eigene ViewHelper und Plugins, das Autoloading und vieles mehr konfigurieren. Die zustzliche Flexibilitt, die das Zend Framework 2 bietet, hat natrlich aucheine hhere Komplexitt zu Folge. Wer seit einigen Jahren mit dem Zend Frame-work 1 gearbeitet hat, der kann damit neue Projekte im Schlaf einrichten. Mit demZend Framework 2 wird dies gerade zu Anfang vielleicht nicht so schnell von derHand gehen. Die neuen Konzepte erfordern neues Denken der Entwickler. Wenn Sie sich mitThemen wie Dependency Injection oder der ereignisgesteuerten Architektur aus-kennen, ist das ein groes Plus fr den Einstieg ins ZF2. Auer mit dem Zend Framework 2 an sich muss der Entwickler sich auch noch mitTools wie Git, Pyrus und Composer auseinandersetzen.35113Kapitel 13BenutzermanagementEine moderne Webanwendung lebt von der Interaktion ihrer Nutzer. Doch selbsteine Website, die nicht mit dem Besucher interagieren mchte, muss von Redakteu-ren gepflegt werden. Fr das Benutzermanagement stellt das ZF2 mehrere Kompo-nenten bereit. Dazu zhlen die Sessionverarbeitung, die Autorisierung und dieAuthentifizierung.Alle Listings aus diesem Kapitel finden Sie auf der buchbegleitenden Bonus-Seite.Details zur Installation finden Sie in Anhang A, Installation der Projektdateien.13.1 Zend\SessionZend\Session setzt auf dem PHP-internen Sessionhandling auf und stellt Containerals einfachen Weg zum Speichern von Daten in Sessions bereit. Dazu gibt es Funktio-nen fr die Sessionverarbeitung und die Mglichkeit, Sessions in einer Datenbank zuschreiben (siehe https://zf2.readthedocs.org/en/latest/modules/zend.session.intro-duction.html).13.1.1 Mit Session-Containern arbeitenUm mit einem Container zu arbeiten, erstellen Sie eine Zend\Session\Container-Instanz und bergeben die zu speichernden Daten. Beim nchsten Seitenaufruf kn-nen Sie darauf zugreifen (siehe Listing 13.1). Bei der Instanziierung eines Container-Objekts bergeben Sie einen Bezeichner, um die gespeicherten Daten identifizierenzu knnen. Dem Objekt knnen Sie Daten zuweisen, indem Sie einen Bezeichner mitWerten belegen. Im ersten Beispiel wird bei jedem Seitenaufruf ein Zhler um 1erhht.use Zend\Debug\Debug;use Zend\Math\Rand;use Zend\Session\Container;$counter = new Container('counter');$counter->number = $counter->number + 1;13 Benutzermanagement352$pizzaList = array('Pizza Salami', 'Pizza Mais', 'Pizza Melone');$randomPizza = $pizzaList[array_rand($pizzaList)];$randomCount = Rand::getInteger(1, 3);$basket = new Container('basket');if (!$basket->offsetExists('order')) {$basketData = array('rows' => array(), 'sum' => 0);} else {$basketData = $basket->offsetGet('order');}$basketData['rows'][] = $randomCount . 'x ' . $randomPizza;$basketData['sum' ] = $basketData['sum'] + $randomCount;$basket->offsetSet('order', $basketData);Debug::dump($counter->number, 'Zhler');Debug::dump($basket->order, 'Warenkorb');Listing 13.1 Einsatz von Zend\Session\ContainerIm zweiten Beispiel werden eine Pizza und ein Container-Objekt erstellt. Mit offset-Exists() prfen Sie, ob ein Bezeichner mit einem Wert belegt ist. Mit offsetGet()holen Sie sich den aktuellen Wert aus der Session. Mit offsetSet() knnen Sie denBezeichner mit einem Wert belegen. Die Werte fr die beiden Bezeichner werden aus-gegeben; dabei wird hochgezhlt, und der Warenkorb wird immer voller.Um die Speicherung der Daten in der Session mssen Sie sich nicht selber kmmern.Diese Aufgabe bernimmt Zend\Session\Container fr Sie.13.1.2 Session-Manager verwendenMit dem Session-Manager knnen Sie die Konfiguration ndern, Sessions startenund beenden, die Cookie-Lebenszeit ndern, die Session-ID erneuern usw. Das Con-tainer-Objekt ermglicht mit getManager() den Zugriff auf den Session-Manager:use Zend\Session\Container;$container = new Container('pizza');$sessionManager = $container->getManager();Sie knnen den Session-Manager auch direkt instanziieren:use Zend\Session\SessionManager;$sessionManager = new SessionManager();13.1 Zend\Session35313ber den Session-Manager haben Sie Zugriff auf die Session-Konfiguration und kn-nen diese bei Bedarf anpassen:$sessionManager->getConfig()->setSavePath(LUIGI_ROOT . '/data/session');$sessionManager->getConfig->setName('luigi_session');$sessionManager->getConfig->setCookieLifetime(3600);Session im Dateisystem speichernWenn Sie die Sessions im Dateisystem speichern, sollten Sie mit setSavePath() denSavePath auf ein Verzeichnis im Projekt umleiten. Ansonsten gibt es Probleme,wenn mehrere Projekte auf dem Server ihre Sessions im selben Verzeichnis spei-chern.Wenn noch keine Session gestartet wurde, knnen Sie dies manuell machen. Sie kn-nen die Session wieder lschen, wobei Session-Daten und Session-Cookie auchgelscht werden:$sessionManager->start();[...]$sessionManager->destroy();Auerdem knnen Sie eine Session-ID erstellen oder die Cookie-Laufzeit auf 0setzen:$sessionManager->regenerateId();$sessionManager->rememberMe(3600);$sessionManager->forgetMe();13.1.3 Sessions in der Datenbank speichernStandardmig werden Session-Daten durch den SaveHandler auf Dateiebenegespeichert, wobei Sie den Pfad zu dem Verzeichnis anpassen knnen. Mchten SieSession-Daten in einer Datenbank speichern, mssen Sie den SaveHandler anpassen.Listing 13.2 zeigt den SQLite3-Dump fr die Datenbanktabelle sessions zum Spei-chern der Session-Daten:DROP TABLE sessions;CREATE TABLE sessions (id varchar(32) primary key,name varchar(32),data text,13 Benutzermanagement354modified integer,lifetime integer);Listing 13.2 SQL-Dump fr Datenbanktabelle sessions fr SQLite3Listing 13.3 zeigt die Konfiguration des Session-SaveHandlers DbTableGateway. Zuerstwird ein Datenbankadapter fr die SQLite3-Datenbank initialisiert, ein TableGate-way-Objekt fr die sessions-Tabelle instanziiert und ein Optionen-Objekt fr denSaveHandler erstellt. Das TableGateway-Objekt und die Optionen werden wiederumfr die Instanziierung des DbTableGateway-SaveHandler bentigt. Danach sind dieVorbereitungen abgeschlossen.use Zend\Db\Adapter\Adapter;use Zend\Db\TableGateway\TableGateway;use Zend\Debug\Debug;use Zend\Session\SessionManager;use Zend\Session\SaveHandler\DbTableGateway;use Zend\Session\SaveHandler\DbTableGatewayOptions;$db = new Adapter(array('driver' => 'Pdo_Sqlite','database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',));$tableGateway = new TableGateway('sessions', $db);$options = new DbTableGatewayOptions();$saveHandler = new DbTableGateway($tableGateway, $options);$sessionManager = new SessionManager();$sessionManager->setSaveHandler($saveHandler);$sessionManager->start();$sessionManager->writeClose();$rows = $tableGateway->select();foreach ($rows as $row) {Debug::dump($row->getArrayCopy());}Listing 13.3 Session-SaveHandler fr das DbTableGateway ndernAls Nchstes wird dem Session-Manager der neue SaveHandler mitgeteilt. Danachwird die Session gestartet. Der Aufruf der Methode writeClose() ist normalerweisenicht notwendig, da sie am Ende der Verarbeitung einer Anfrage automatisch aufge-13.2 Zend\Permissions\Acl35513rufen wird. Hier dient der Aufruf nur zu Demonstrationszwecken, damit bei derAbfrage der Daten ber das TableGateway auch beim ersten Seitenaufruf etwas ausge-geben wird. Die Session-Daten werden in der Datenbank abgelegt und knnen wei-terverwendet werden. So knnte eine Verknpfung zu einem bestimmten Benutzerabgelegt werden oder es knnte abgefragt werden, welche Sessions sich in den letz-ten 5 Minuten verndert haben, um die Anzahl der aktiven Nutzer zu schtzen.13.2 Zend\Permissions\AclBei der Autorisierung legen Sie fest, welche Funktionen ein Benutzer in der Anwen-dung ausfhren darf. Dafr stellt Zend\Permissions\Acl eine Zugriffskontrollliste(access control list, kurz ACL) bereit. Sie legt fest, wer auf die vorhandenen Ressour-cen welche Rechte anwenden darf oder nicht. Details finden Sie im Referenzhand-buch unter http://zf2.readthedocs.org/en/latest/index.html#zend-permissions-acl.13.2.1 BegrifflichkeitenEine ACL besteht aus mehreren Bestandteilen. Das erste Element sind die Benutzer-rollen. Beispiele hierfr sind Gste, Kunden, Redakteure oder Administratoren. DieRollen knnen mit Zend\Permissions\Acl verschachtelt werden, sodass ein Adminis-trator z. B. alle Rechte der Gste, Kunden und Redakteure erben kann.Das zweite Element sind die Ressourcen. Dabei handelt es sich um die Objekte, aufdie Rechte ausgebt werden sollen. Dies knnen z. B. Produkte wie eine Pizza, Artikelaus dem CMS oder ein Profilbild sein. Oft werden auch die Action-Controller als Res-sourcen verwendet. Auch Ressourcen knnen voneinander erben.Das dritte Element sind die Privilegien. Dabei geht es darum, welche Aufgabe miteiner Ressource ausgefhrt werden soll. Ein Produkt kann bestellt oder verndertwerden, ein Artikel kann erstellt oder gelscht werden, und ein Profilbild kann ver-kleinert oder ausgedruckt werden. Oft werden die Aktionsmethoden aus den Action-Controllern als Privilegien verwendet.Als viertes Element dienen Regeln. Diese besagen, dass eine Rolle auf eine Ressourceein Privileg anwenden darf oder nicht. Kunden drfen Produkte bestellen, Redak-teure drfen Artikel erstellen und Administratoren drfen Profilbilder verkleinern.13.2.2 ACL definierenIn Listing 13.4 wird eine ACL fr einen Pizza-Service definiert. Die Rollen guest, custo-mer, staff und admin werden definiert, wobei customer von guest und staff von13 Benutzermanagement356customer erben soll. Die beiden Ressourcen product und order werden definiert. ZumSchluss werden die Privilegien festgelegt.use Zend\Debug\Debug;use Zend\Permissions\Acl\Acl;$acl = new Acl();$acl->addRole('guest');$acl->addRole('customer', 'guest');$acl->addRole('staff', 'customer');$acl->addRole('admin');$acl->addResource('product');$acl->addResource('order');$acl->allow('guest', 'product', array('show', 'list'));$acl->allow('customer', 'product', array('basket'));$acl->allow('staff', 'product', array('create', 'update'));$acl->deny('guest', 'order');$acl->allow('customer', 'order', array('create', 'send'));$acl->allow('staff', 'order', array('update', 'list', 'finish'));$acl->allow('admin');Debug::dump($acl->getRoles());Debug::dump($acl->getResources());Listing 13.4 ACL mit Zend\Permissions\Acl definierenDiese ACL beschreibt im Einzelnen folgende Benutzerrechte: Gste drfen Produkte anzeigen und auflisten. Kunden drfen Produkte in den Warenkorb legen und alles tun, was Gste drfen. Mitarbeiter drfen Produkte anlegen und bearbeiten und alles tun, was Kundenund Gste drfen. Gste drfen nichts mit Bestellungen machen. Kunden drfen Bestellungen anlegen und abschicken. Mitarbeiter drfen Bestellungen verndern, auflisten und abschlieen. Administratoren drfen alles.brigens ist der Aufruf von deny() berflssig, da alle Rollen fr alle Ressourcen ersteinmal nichts drfen. Zudem knnen Sie auch globale Rechte vergeben und sperren,indem Sie keine Privilegien (und Ressourcen) beim Aufruf von allow() und deny()angeben.13.2 Zend\Permissions\Acl3571313.2.3 ACL abfragenEine ACL wird mit isAllowed() abgefragt, wobei die Rolle, die Ressource und das Pri-vileg oder Teile davon angegeben werden. Listing 13.5 zeigt die Abfrage der ACL vonoben. Es wird true oder false zurckgegeben, abhngig von den vorhandenen Rech-ten der Rolle.use Zend\Debug\Debug;use Zend\Permissions\Acl\Acl;[...]Debug::dump($acl->isAllowed('guest', 'product', 'show'));Debug::dump($acl->isAllowed('guest', 'product', 'basket'));Debug::dump($acl->isAllowed('guest', 'order', 'create'));Debug::dump($acl->isAllowed('customer', 'product', 'basket'));Debug::dump($acl->isAllowed('customer', 'product', 'update'));Debug::dump($acl->isAllowed('customer', 'order', 'create'));Debug::dump($acl->isAllowed('staff', 'product', 'basket'));Debug::dump($acl->isAllowed('staff', 'product', 'create'));Debug::dump($acl->isAllowed('staff', 'product', 'delete'));Debug::dump($acl->isAllowed('admin', 'product', 'show'));Debug::dump($acl->isAllowed('admin', 'product', 'delete'));Debug::dump($acl->isAllowed('admin', 'order', 'finish'));Listing 13.5 Zend\Permissions\Acl abfragenEs ist denkbar, bei einer Abfrage kein Privileg abzugeben, wenn Sie prfen wollen, obeine Rolle mit einer Ressource berhaupt etwas machen darf.13.2.4 ACL cachenDa der Aufbau einer ACL recht komplex sein kann, sollten Sie fertige Acl-Objekte mitZend\Cache cachen (siehe Listing 13.6). Nach der Konfiguration des Cache-Storagewird geprft, ob sich die ACL im Cache befindet. Falls nein, wird sie erstellt undgecacht. Eine Meldung gibt an, ob das Acl-Objekt aus dem Cache stammt oder nicht.use Zend\Cache\StorageFactory;use Zend\Debug\Debug;use Zend\Permissions\Acl\Acl;$cache = StorageFactory::factory(array('adapter' => array('name' => 'filesystem','options' => array(13 Benutzermanagement358'namespace' => 'acl','ttl' => 5,'cache_dir' => LUIGI_ROOT . '/data/cache',),),'plugins' => array('serializer'),));$acl = $cache->getItem('acl');if (!$acl) {$acl = new Acl();[...]$cache->setItem('acl', $acl);Debug::dump('ACL in den Cache geschrieben');} else {Debug::dump('ACL aus dem Cache gelesen');}Listing 13.6 ACL mit Zend\Cache speichernDetails zu Zend\Cache finden Sie in Abschnitt 4.3, Zend\Cache.13.3 Zend\Permissions\RbacEine Alternative zur ACL ist Zend\Permissions\Rbac, mit der Sie eine rollenbasierteZugriffskontrolle (role-based access control RBAC) umsetzen knnen. Im Gegensatzzur ACL liegt der Fokus auf den Rollen und nicht auf den Ressourcen. Die Details fin-den Sie im Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-permissions-rbac.13.3.1 BegrifflichkeitenDie RBAC basiert auf drei Bausteinen. Das erste Element ist die Identitt, z. B. Luigi,Alessandro und Francesca. Jeder Benutzer hat genau eine Identitt.Das zweite Element sind die Rollen. Eine Identitt kann verschiedene Rollen anneh-men. Whrend Alessandro der einzige Administrator ist, sind Luigi, Alessandro undFrancesca alle Mitarbeiter. Rollen knnen auch unterteilt sein.13.3 Zend\Permissions\Rbac35913Das dritte Element sind die Berechtigungen. Eine Berechtigung kann verschiedenenRollen zugeordnet sein, whrend eine Rolle verschiedene Berechtigungen habenkann. Whrend ein Administrator Bestellungen lschen kann, kann ein Mitarbeitersie nur verndern.13.3.2 RBAC definierenBitte beachten Sie, dass Sie nicht wie bei der ACL globale Rechte vergeben knnen. Esist nicht mglich, einem Administrator alle Berechtigungen in einem Rutsch zugeben. Sie mssen fr jede Rolle alle Genehmigungen definieren oder mit Hierar-chien arbeiten.Um die RBAC zu definieren, mssen Sie Rollen, Berechtigungen und Beziehungen zuanderen Rollen festlegen. Danach knnen Sie das Role-Objekt einem Rbac-Objektzuordnen. In Listing 13.7 werden vier Rollen und deren Berechtigungen definiert. Sollein Role-Objekt die Berechtigungen eines anderen erben, knnen Sie mit addChild()die untergeordnete Rolle angeben, von der die Rechte geerbt werden sollen. Es kannbeliebig viele untergeordnete Rollen geben. Mit addRole() ordnen Sie eine Rolleeinem Rbac-Objekt zu.use Zend\Permissions\Rbac\Rbac;use Zend\Permissions\Rbac\Role;$roleGuest = new Role('guest');$roleGuest->addPermission('pizza_list');$roleGuest->addPermission('pizza_show');$roleCustomer = new Role('customer');$roleCustomer->addPermission('pizza_basket');$roleCustomer->addPermission('order_create');$roleCustomer->addPermission('order_send');$roleCustomer->addChild($roleGuest);$roleStaff = new Role('staff');$roleStaff->addPermission('pizza_create');$roleStaff->addPermission('pizza_update');$roleStaff->addPermission('order_update');$roleStaff->addPermission('order_cancel');$roleStaff->addPermission('order_finish');$roleStaff->addChild($roleCustomer);$roleAdmin = new Role('admin');$roleAdmin->addPermission('pizza_delete');13 Benutzermanagement360$roleAdmin->addPermission('order_delete');$roleAdmin->addChild($roleStaff);$rbac = new Rbac();$rbac->addRole($roleGuest);$rbac->addRole($roleCustomer);$rbac->addRole($roleStaff);$rbac->addRole($roleAdmin);Listing 13.7 Zend\Permissions\Rbac mit vier Rollen definierenDie Berechtigungen bestehen aus einem Prfix (wie 'pizza' oder 'order'), einemUnterstrich und dem eigentlichen Namen (wie 'list', 'basket' oder 'cancel'). Sie kn-nen diesen Vorschlag bernehmen, die Reihenfolge ndern, einen Punkt als Trennerverwenden oder mit Zahlen arbeiten. Zudem knnen Sie auch den Namen eines Con-trollers und einer Aktionsmethode verwenden. Wichtig ist nur dass jede Berechti-gung eindeutig ist.Das erstellte Rbac-Objekt lsst sich cachen. Die Vorgehensweise fr das Cachen einesAcl-Objekts finden Sie in Listing 13.6.13.3.3 RBAC abfragenFr die Abfrage der RBAC mssen Sie den Namen der Rolle sowie den Namen derBerechtigung an die Methode isGranted() bergeben. Sie erhalten als Ergebnis trueoder false. In Listing 13.8 werden Prfungen fr die vorherige RBAC vorgenommen,wobei die ersten sieben Zeilen true und die letzten vier false ausgeben. Bei den feh-lerhaften Prfungen sind die abgefragten Berechtigungen fr die Rolle nicht vorhan-den. Bei der letzten Abfrage auf 'order_copy' ist diese Berechtigung in der RBAC garnicht definiert.use Zend\Debug\Debug;use Zend\Permissions\Rbac\Rbac;use Zend\Permissions\Rbac\Role;[...]Debug::dump($rbac->isGranted('guest', 'pizza_list'));Debug::dump($rbac->isGranted('customer', 'pizza_basket'));Debug::dump($rbac->isGranted('customer', 'pizza_list'));Debug::dump($rbac->isGranted('staff', 'pizza_list'));Debug::dump($rbac->isGranted('staff', 'order_cancel'));Debug::dump($rbac->isGranted('admin', 'pizza_delete'));Debug::dump($rbac->isGranted('admin', 'order_create'));13.4 Zend\Authentication36113Debug::dump($rbac->isGranted('guest', 'pizza_create'));Debug::dump($rbac->isGranted('customer', 'order_finish'));Debug::dump($rbac->isGranted('staff', 'order_delete'));Debug::dump($rbac->isGranted('admin', 'order_copy'));Listing 13.8 Zend\Permissions\Rbac abfragen13.4 Zend\AuthenticationZend\Authentication hilft ihnen, die Benutzer Ihrer Anwendung zu authentifizieren.Die Komponente bringt mehrere Adapter mit sich, die fr die Authentifizierungzustndig sind. Auerdem stehen Storages zum Speichern des authentifiziertenBenutzers sowie ein Authentifizierungsservice bereit. Weitere Details finden Sie imReferenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-authentication.Ein Beispiel fr einen Authentifizierungsadapter, der fr die Passwortverschlsse-lung die Komponente Zend\Crypt\Password\Bcrypt einsetzt, finden Sie in Abschnitt17.3.1, Authentifizierungsadapter.13.4.1 Per HTTP authentifizierenBei der Authentifizierung mit HTTP mssen Sie die Varianten Basic Authenticationund Digest Authentication unterscheiden. Der Unterschied ist, dass die Passwrterbei der Digest Authentication nicht im Klartext bermittelt werden.Fr die Basic Authentication wird die Passwortdatei /data/auth/basic.pw bentigt(siehe Listing 13.9). Der Zeilenaufbau ist Benutzername:Realm:Passwort, wobei diePasswrter unverschlsselt sind.luigi:Luigis Pizza-Service:luigifrancesca:Luigis Pizza-Service:francescaalessandro:Luigis Pizza-Service:alessandrovalentina:Luigis Pizza-Service:valentinaListing 13.9 Die Passwortdatei basic.pw fr eine Basic-HTTP-AuthenticationDas Beispiel luft in Listing 13.10 im Kontext eines View-Scripts, wundern Sie sichalso nicht ber den Zugriff auf den Service-Manager ber den HelperPluginManager.Aus dem Service-Manager werden die Request- und Response-Objekte geholt. DerHttp-Adapter wird mit der Methode Basic Authentication und dem Realm LuigisPizza-Service konfiguriert. Der FileResolver wird fr die Passwortdatei konfiguriertund Resolver, Request und Response werden an den Adapter bergeben. Durch den13 Benutzermanagement362Aufruf von authenticate() erfolgt die Authentifizierung. Das Result-Objekt kannausgewertet werden und ermglicht bei Erfolg die Abfrage der angemeldeten Identi-tt.use Zend\Authentication\Adapter\Http;use Zend\Authentication\Adapter\Http\FileResolver;$sm = $this->getHelperPluginManager()->getServiceLocator();$response = $sm->get('response');$request = $sm->get('request');$adapter = new Http(array('accept_schemes' => 'basic','realm' => 'Luigis Pizza-Service','digest_domains' => '/listing/listing1310','nonce_timeout' => 3600,));$basicResolver = new FileResolver();$basicResolver->setFile(LUIGI_ROOT . '/data/auth/basic.pw');$adapter->setBasicResolver($basicResolver);$adapter->setRequest($request);$adapter->setResponse($response);$result = $adapter->authenticate();if (!$result->isValid()) {echo 'Du kommst hier nicht rein!';} else {$identity = $result->getIdentity();echo 'Herzlich Willkommen ' . $identity['username'] . '!';}Listing 13.10 Basic-HTTP-Authentication mit Http-AdapterWenn Sie http://luigis-pizza.local/listing/listing1310 aufrufen, knnen Sie das Bei-spiel ausprobieren.Fr die Digest Authentication ist die Passwortdatei unter /data/auth/digest.pw zufinden (siehe Listing 13.11). Der Aufbau ist derselbe wie bei der Basic Authentication,13.4 Zend\Authentication36313nur ist das Passwort mit md5() verschlsselt und der Hash wird z. B. aus der Kombina-tion luigi:Luigis Pizza-Service:luigi gebildet.luigi:Luigis Pizza-Service:6b150f7dc4cdc0fe1b16315482544685francesca:Luigis Pizza-Service:d23e77cb95c9129102cd8452a9e10390alessandro:Luigis Pizza-Service:b03fd2ec130d394f1af3960e3bb37017valentina:Luigis Pizza-Service:8792865b2896655c5de293ef425a06c3Listing 13.11 Die Passwortdatei digest.pw fr eine Digest-HTTP-AuthenticationDer Ablauf der Digest Authentication ist in Listing 13.12 (gekrzt) zu sehen und unter-scheidet sich kaum von der Basic Authentication. Die Konfiguration des accept_schemes ist anders, die Passwortdatei fr die Digest Authentication wird verwendet,und der Resolver wird mit setDigestResolver() bergeben. Probieren Sie es mithttp://luigis-pizza.local/listing/listing1312 aus.[...]$adapter = new Http(array('accept_schemes' => 'digest','realm' => 'Luigis Pizza-Service','digest_domains' => '/listing/listing1312','nonce_timeout' => 3600,));$digestResolver = new FileResolver();$digestResolver->setFile(LUIGI_ROOT . '/data/auth/digest.pw');$adapter->setDigestResolver($digestResolver);[...]Listing 13.12 Digest-HTTP-Authentication mit Http-Adapter (gekrzt)13.4.2 Gegen eine Datenbanktabelle authentifizierenMit Zend\Authentication knnen Sie gegen eine Datenbanktabelle authentifizieren.Listing 13.13 zeigt einen SQLite3-Dump fr die Tabelle users, die die Benutzerdatenenthlt. Das Passwort fr den Benutzer luigi lautet luigi.DROP TABLE users;CREATE TABLE users (id integer primary key,name varchar(32),13 Benutzermanagement364pass varchar(32));INSERT INTO "users"VALUES (1,'luigi','ccebba93f54d6bf2b17f8350e7c12ec4');Listing 13.13 SQL-Dump fr die Datenbanktabelle users fr SQLite3Passwortverschlsselung mit BcryptDer Einfachheit halber werden die Passwrter mit md5() verschlsselt. Sicherer isteine Verschlsselung mit Bcrypt. In Abschnitt 17.3, Authentifizierung und Autori-sierung, finden Sie einen Authentifizierungsadapter, der zur VerschlsselungBcrypt verwendet.Zur Authentifizierung gegen eine Datenbanktabelle kommt der DbTable zum Einsatz.In Listing 13.14 werden Zugangsdaten notiert und wird der Authentifizierungsadap-ter mit dem Datenbankadapter und den Namen fr die Tabelle, Benutzerspalte undPasswortspalte konfiguriert.use Zend\Authentication\Adapter\DbTable;use Zend\Db\Adapter\Adapter;use Zend\Debug\Debug;$credentials = array(array('name' => 'francesca', 'pass' => 'francesca'),array('name' => 'luigi', 'pass' => 'francesca'),array('name' => 'luigi', 'pass' => 'luigi'),);[...]$authAdapter = new DbTable($db, 'users', 'name', 'pass');foreach ($credentials as $row) {$authAdapter->setIdentity($row['name']);$authAdapter->setCredential(md5($row['pass']));$result = $authAdapter->authenticate();Debug::dump($result);if ($result->isValid()) {13.4 Zend\Authentication36513Debug::dump($authAdapter->getResultRowObject(null, 'pass'));}}Listing 13.14 Authentifizierung mit dem DbTable-AdapterFr jede Zeile werden im Authentifizierungsadapter der Benutzername und das Pass-wort festgelegt und wird die Authentifizierung gestartet. War der Versuch erfolglos,wird das Result-Objekt ausgegeben. Dem Result-Objekt knnen Sie die genaue Feh-lermeldung entnehmen. War die Authentifizierung erfolgreich, wird zustzlich dergefundene Datensatz mit getResultRowObject() ausgegeben. Durch die Angabe von'pass' als zweiten Parameter wird der Inhalt der Passwortspalte nicht zurckge-geben.13.4.3 AuthentifizierungsserviceSie knnen Ihre Benutzerauthentifizierung direkt mit einem der bisher vorgestelltenAdapter durchfhren. Der Zend\Authentication\AuthenticationService erleichtertdie Authentifizierung jedoch noch weiter. Um den Ablauf an einem praktischen Bei-spiel zu demonstrieren, bentigen Sie ein Formular zum Anmelden und Abmelden(siehe Listing 13.15). Weitere Details zu Zend\Form finden Sie in Kapitel 12, Formular-verarbeitung.namespace Pizza\Form;use Zend\Form\Element\Password;use Zend\Form\Element\Submit;use Zend\Form\Element\Text;use Zend\Form\Form;class LoginForm extends Form{public function __construct(){parent::__construct('login');$nameElement = new Text('name');$nameElement->setLabel('Benutzername');$passElement = new Password('pass');$passElement->setLabel('Passwort');$submitElement = new Submit('login');$submitElement->setValue('Anmelden');$submitElement->setAttribute('class', 'btn');13 Benutzermanagement366$this->add($nameElement);$this->add($passElement);$this->add($submitElement);}}class LogoutForm extends Form{public function __construct(){parent::__construct('logout');$submitElement = new Submit('logout');$submitElement->setValue('Abmelden');$submitElement->setAttribute('class', 'btn');$this->add($submitElement);}}Listing 13.15 Formulare zum Anmelden und Abmelden mit Zend\AuthenticationDer AuthenticationService bentigt einen Authentifizierungsadapter (siehe Listing13.16) Zu Beginn werden der AuthenticationService und das Request-Objekt initia-lisiert, und es wird geprft, ob eine POST-Anfrage vorliegt. Wenn dies der Fall ist, wirdberprft, ob der Login-Button geklickt, aber kein Benutzername eingegeben wurde.In diesem Fall wird eine Fehlermeldung festgelegt. Die nchste Prfung schaut nachdem Login-Button. In diesem Fall werden der Datenbankadapter und der Authenti-fizierungsadapter konfiguriert, wobei der Authentifizierungsadapter den Benutzer-namen und das Passwort bergeben bekommt. Danach wird die Authentifizierungdurchgefhrt. Mgliche Fehlermeldungen werden zwischengespeichert. Die letztePrfung schaut nach dem Logout-Button und zerstrt bei Bedarf die aktuelle Identi-tt und meldet den Nutzer ab. Der Rest des Listings kmmert sich um die Ausgabeder Meldungen und des Formulars.use Pizza\Form\LoginForm;use Pizza\Form\LogoutForm;use Zend\Authentication\AuthenticationService;use Zend\Authentication\Adapter\DbTable;use Zend\Db\Adapter\Adapter;use Zend\Http\PhpEnvironment\Request;13.4 Zend\Authentication36713$authService = new AuthenticationService();$request = new Request();if ($request->isPost()) {if ($request->getPost('login') && !$request->getPost('name')) {$showMessage = 'Es wurde kein Benutzername eingegeben';} elseif ($request->getPost('login')) {$db = new Adapter(array('driver' => 'Pdo_Sqlite','database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',));$authAdapter = new DbTable($db, 'users', 'name', 'pass');$authAdapter->setIdentity(strtolower($request->getPost('name')));$authAdapter->setCredential(md5($request->getPost('pass')));$result = $authService->authenticate($authAdapter);if (!$result->isValid()) {$showMessage = implode('', $result->getMessages());}} elseif ($request->getPost('logout')) {$authService->clearIdentity();}}if ($authService->hasIdentity()) {$showMessage = '"' . $authService->getIdentity(). '" angemeldet!';}$alertClass = $authService->hasIdentity()? 'alert-success': 'alert-error';if ($showMessage) {echo ''. $showMessage . '';}$form = $authService->hasIdentity()13 Benutzermanagement368? new LogoutForm(): new LoginForm();$form->setData($request->getPost()->toArray());$form->prepare();echo $this->form()->openTag($form);foreach ($form as $element) {echo $this->formRow($element);}echo $this->form()->closeTag();Listing 13.16 AuthenticationService mit DbTable einsetzenDer AuthenticationService lsst sich mit allen Adaptern fr die Authentifizierungkombinieren. Die Vorgehensweise ist dabei prinzipiell dieselbe, wobei nicht jedesMal ein Formular bentigt wird. In Abschnitt 17.3, Authentifizierung und Autorisie-rung, finden Sie ein Modul, das die Authentifizierung mit der Autorisierung imMVC-Kontext verknpft.13.5 Zend\LdapDie Zend\Ldap-Komponente ermglicht die Kommunikation zwischen Ihrer Anwen-dung und einem LDAP-Verzeichnis. Sie knnen Zend\Ldap eigenstndig und alsAdapter mit Zend\Auth einsetzen. Weitere Details zu Zend\Ldap finden Sie im Refe-renzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-ldap.Index611IndexAAggregateResolver ................................................. 244Akismet ....................................................................... 526Anwendungsmodul ............................................... 383Controller ................................................................ 173Konfiguration .............................................. 171, 384Men ....................................................................... 399Modul-Klasse........................................................ 170Request-Parameter ............................................. 175Seitenlayout.......................................................... 395View-Script ............................................................. 173Apache 2........................................................................ 57Konfiguration ........................................................ 57Virtual Host Linux................................................ 57Virtual Host Windows ........................................ 59Aspektorientierte Programmierung ................ 117AssetManager ............................................................ 155Atom-Feeds............................................................... 309BB8-Filter ....................................................................... 526Barcodes ...................................................................... 314Basket Controller-Plugin ..................................... 580Bcrypt ........................................................................... 376Benutzermanagement ........................................... 351Authentifizierungsservice ............................... 365Session-Manager ................................................ 352Zend\Authentication ........................................ 361Zend\Ldap ............................................................ 368Zend\Permissions\Acl....................................... 355Zend\Permissions\Rbac ................................... 358Zend\Session ......................................................... 351Benutzer-Modul....................................................... 453Anforderungen .................................................... 453Authentifizierungsadapter ............................ 456Authentifizierungsservice .............................. 460Autorisierungsservice ....................................... 461Benutzerrechte.................................................... 464ffentlicher Bereich ........................................... 478UserListener .......................................................... 475User-Service ......................................................... 466View-Helper ......................................................... 470Vorbereitungen ................................................... 454Blog-Modul ................................................................. 411Administrationsbereich .................................. 444Blog-Modul (Forts.)Anforderungen ..................................................... 411Blog-Service ........................................................... 431Einrichtung ............................................................ 412Entitt ...................................................................... 421Filter......................................................................... 426Formular ................................................................ 428Formular-Factories............................................ 429Modelinfrastruktur............................................ 419ffentlicher Bereich.......................................... 440Routing .................................................................... 415Screenshot ................................................... 443, 450TableGateway...................................................... 423CCKEditor............................................................ 409, 448Inline Editing........................................................ 549Closures ........................................................................ 36CmsContentBlock-View-Helper ................ 553, 558CMS-Modul................................................................ 549Anforderungen .................................................... 549CMS-Service .......................................................... 556CMS-Service erweitern...................................... 556Controller .............................................................. 562Formular ................................................................. 555Funktionsweise ................................................... 563JavaScript-Funktionen .................................... 560Textblcke .............................................................. 553View-Helper .................................................. 553, 558Vorbereitungen ................................................... 550CommentShowComments-View-Helper ....... 513CommentShowLinks-View-Helper.................... 511Composer ..................................................................... 65Autoloading ........................................................... 83Fremdmodul installieren ................................. 179SkeletonApplication installieren ................... 70Zend Framework 2 installieren ....................... 65ConsoleRenderer..................................................... 245Controller .................................................................... 211Action-Controller ................................................ 212Einfhrung ............................................................. 211Objekt-Zugriff ....................................................... 214RESTful-Controller .............................................. 218Services injizieren ................................................ 215Controller-PluginBasket..................................................................... 580Index612Controller-Plugin (Forts.)Eigenes Plugin erstellen ................................... 234FilePostRedirectGet.................................. 231, 500FlashMessenger ................................................... 233Forward .................................................................. 227Layout ..................................................................... 225Params .................................................................... 229PostRedirectGet................................................... 229Redirect ................................................................... 227SpamCheck............................................................ 532Url ............................................................................. 225Zugriff...................................................................... 224CurrencyFormat-View-Helper .................. 293, 397Cycle-View-Helper .................................................. 252DDateFormat-View-Helper..................................... 293Datei-Uploads .......................................................... 498Datenbank .................................................................. 257Datenbankadapter ............................................ 258Datenbankmodell .............................................. 257Datenbankzugriffe loggen.............................. 275DDL.......................................................................... 270Doctrine 2 .............................................................. 281Microsoft SQL Server ......................................... 258MySQL ............................................................ 257, 303Paginierung ......................................................... 304PostgreSQL ................................................... 257, 303RowGateway ........................................................ 278SQL-Abfragen ....................................................... 265SQLite3 ........................................................... 257, 303TableGateway ....................................................... 271Zend\Db.................................................................. 257Date-View-Helper.................................................... 393DDL............................................................................... 270Dependency Injection ..................................... 41, 127Zend\Di .................................................................... 141DluTwBootstrap ....................................................... 337Doctrine 2 ................................................................... 281Annotationen ....................................................... 283DoctrineORMModule ........................................ 281Dokumentation................................................... 287Entitten ................................................................ 283Entity-Manager .................................................. 286Installation............................................................ 281Modul konfigurieren ......................................... 282Relationen ............................................................. 285Reverse Engineering ......................................... 286Doctrine/Common ................................................. 343DoctrineORMModule ............................................ 281EEntwurfsmusterBeobachter ............................................................. 117Dependency Injection........................................ 127Ereignisgesteuerte Architektur ...................... 117MVC .......................................................................... 183Service-Locator..................................................... 127Ereignisgesteuerte Architektur .................... 45, 117Event-Manager .................................................... 117EscapeCss-View-Helper ......................................... 251EscapeHtmlAttr-View-Helper ............................. 251EscapeHtml-View-Helper ..................................... 251EscapeJs-View-Helper............................................. 251EscapeUrl-View-Helper.......................................... 251Escaping ............................................................ 248, 250Zend\Escaper ........................................................ 312Event-driven architecture ..................................... 45EventFeature.............................................................. 275ext/intl .......................................................................... 56FFeedRenderer............................................................ 245FeedStrategy ...................................................... 245, 311FilePostRedirectGet Plugin ........................ 231, 500FlashMessenger-Plugin ........................................ 233FormElementErrors-View-Helper .................... 335FormElement-View-Helper................................. 335FormLabel-View-Helper ....................................... 335FormRow-View-Helper ......................................... 334Formularverarbeitung ........................................... 315Ausgabe mit View-Helpern ............................ 333Fieldset als Collection ....................................... 329Formularelemente .............................................. 331Objekte anbinden .............................................. 340Validierung ........................................................... 337Zend\Form ............................................................ 322Zend\InputFilter .................................................. 315Form-View-Helper .................................................. 334Fortschrittsbalken ................................................. 606Fremdmodule............................................................ 179AssetManager....................................................... 155DluTwBootstrap ................................................. 337Doctrine/common ............................................. 343doctrine/common.............................................. 343DoctrineORMModule ........................................ 281SmartyModule..................................................... 256ZfcBase..................................................................... 181ZfcTwitterBootstrap .......................................... 337Index613Fremdmodule (Forts.)ZfcUser ..................................................................... 181ZFTool....................................................................... 69GGetOrder-View-Helper ......................................... 586Git & GitHub ............................................................... 39Einfhrung .............................................................. 39Fremdmodul klonen ........................................... 181SkeletonApplication installieren ................... 69GlobalAdapterFeature ........................................... 275Gravatar-View-Helper ........................................... 252HHeadTitle-View-Helper ........................................ 388HtmlFlash-View-Helper ........................................ 252HtmlList-View-Helper ........................................... 252HtmlObject-View-Helper ..................................... 252HtmlPage-View-Helper ......................................... 252HTMLPurifier ........................................................... 406HtmlQuicktime-View-Helper............................. 252Hydrator............................................. 263, 341, 377, 571HydratorInterface .............................................. 341ReflectionHydrator ........................................... 264Iinclude_path ............................................................... 61InlineScript-View-Helper ..................................... 252Installation SkeletonApplication........................ 68Composer ................................................................. 70Git .............................................................................. 69ZIP-Paket ................................................................. 69Installation Zend Framework ............................... 61Composer ................................................................. 65include_path .......................................................... 61Pyrus .......................................................................... 62ZIP-Paket .................................................................. 61Internationalisierungext/intl ...................................................................... 56Sprache mittels Routing ................................. 205Zend\I18n .............................................................. 289JJSONController ............................................................... 247JsonModel .............................................................. 243JsonRenderer ........................................................ 245JSON (Forts.)JsonStrategy ......................................................... 245Zend\Json................................................................ 312Json ................................................................................ 312JsonRenderer ............................................................ 245JsonStrategy .............................................................. 245Json-View-Helper .................................................... 252KKommentar-Modul................................................ 505Administrationsbereich................................... 507Anforderungen .................................................... 505Kommentare anlegen ....................................... 519Kommentar-Service ........................................... 521Konfiguration ..................................................... 508Modelinfrastruktur........................................... 506Spamabwehr ......................................................... 535View-Helper ............................................................ 511View-Helper einsetzen....................................... 516Vorbereitungen .................................................. 506Konzepte ...................................................................... 40Dependency Injection.......................................... 41Ereignisgesteuerte Architektur ....................... 45Event-driven architecture ................................. 45Modularitt ............................................................ 40Service-Locator...................................................... 43LLate Static Binding.................................................... 38LayoutListener ................................................................... 395Layout-Plugin ........................................................... 225Layout-View-Helper............................................... 252Library-Modul ........................................................... 177Listings ........................................................................... 31MMasterSlaveFeature ................................................ 275MetadataFeature ...................................................... 275Microsoft SQL Server ............................................. 258ModelinfrastrukturBlog-Modul ........................................................... 419Model-View-Controller.......................................... 183Modularitt ................................................................. 40Anwendungsmodul ........................................... 169Fremdmodule ....................................................... 179Library-Modul ...................................................... 177Module.php.............................................................. 77Index614Modularitt (Forts.)Modul-Manager ................................................... 151Verzeichnisstruktur ............................................. 77ModuleAnwendungsmodul ........................................... 383Benutzer-Modul .................................................. 453Blog-Modul ............................................................ 411CMS-Modul .......................................................... 549Kommentar-Modul........................................... 505Pizza-Modul ......................................................... 483Shop-Modul .......................................................... 565Spamabwehr-Modul.......................................... 525Mvc Events ................................................................ 205dispatch.error...................................................... 206finish-Event .......................................................... 209route-Event........................................................... 205MySQL ........................................................ 257, 259, 303NNavigation-View-Helper............................. 299, 302NumberFormat-View-Helper ............................. 293PPageTitle-View-Helper ......................................... 388PaginationControl-View-Helper ...................... 305PartialLoop-View-Helper...................................... 252Partial-View-Helper ................................................ 252Passwrter verschlsseln..................................... 376PHP 5.3........................................................................... 34Buchtipps ................................................................ 60Closures .................................................................... 36Late Static Binding ............................................... 38PHP-Namespaces ................................................. 34PHP-Extensions ......................................................... 54PHP-Frameworks....................................................... 27PhpRenderer ............................................................. 245PhpRendererStrategy ............................................ 245PHP-Version ................................................................ 53Pizza-Modul .............................................................. 483Administrationsbereich ................................... 501Anforderungen ................................................... 483Bild-Upload .......................................................... 498Entitt .................................................................... 489Modelinfrastruktur ............................................ 485Pizza-Karussell ................................................... 502Pizza-Service ........................................................ 490TableGateway ..................................................... 486Vorbereitungen .................................................. 484Placeholder-View-Helper ..................................... 252PostgreSQL........................................................ 257, 303PostRedirectGet Plugin ........................................ 229Pyrus .............................................................................. 62RRenderChildModel-View-Helper ...................... 252Renderer ..................................................................... 245ConsoleRenderer................................................. 245FeedRenderer ....................................................... 245JsonRenderer ........................................................ 245PhpRenderer ......................................................... 245RenderToPlaceholder-View-Helper................. 252Resolver ...................................................................... 244AggregateResolver............................................. 244TemplateMapResolver ..................................... 244TemplatePathStack ........................................... 244RESTful-Webservice ................................................ 218Controller .............................................................. 219Konfiguration ....................................................... 221Model-Service ...................................................... 220Testen mit Zend\Http\Client ......................... 223Routing........................................................................ 192Beispiel..................................................................... 415Konfiguration ...................................................... 201Route-Typ ............................ 193, 194, 195, 196, 199Route-Typen ......................................................... 192SimpleRouteStack ............................................... 197Tipps ........................................................................ 203TreeRouteStack ................................................... 198Zend\Navigation ................................................ 296RowGatewayFeature..................................... 275, 280RSS-Feeds................................................................... 309SServerUrl-View-Helper ......................................... 223Service-Locator .................................................. 43, 127Zend\ServiceManager ....................................... 127Shop ModulAdministrationsbereich................................... 596Einsatz in Modulen............................................ 593Funktionsweise ................................................... 594Shop-Modul............................................................... 565Anforderungen .................................................... 565Bestellservice ......................................................... 573Controller-Plugin............................................... 580Hydrator ................................................................. 571Modelinfrastruktur............................................ 567Positionen ............................................................. 569Script ....................................................................... 589Index615Shop-Modul (Forts.)Serialisierung ........................................................ 571View-Helper .......................................................... 581View-Script ........................................................... 589Vorbereitungen .................................................. 566Warenkorb............................................................. 567Warenkorb-Controller ...................................... 587Warenkorb-Service ............................................. 576ShowBasket-View-Helper..................................... 581ShowForm-View-Helper ....................................... 391ShowMessages-View-Helper.............................. 389SimpleRouteStack ................................................... 197SkeletonApplication................................................. 68Autoloading mit Composer.............................. 83Hauptverzeichnis .................................................. 71Installation aus ZIP-Paket ............................... 69Installation mit Composer ............................... 70Installation mit Git ............................................. 69Konfiguration ........................................................ 82Konfigurationsverzeichnis ............................... 73Modulverzeichnis ................................................. 77Public-Verzeichnis ................................................ 74Vendor-Verzeichnis.............................................. 76SOAP .............................................................................. 371Spamabwehr-Modul .............................................. 525Anforderungen .................................................... 525Autoloading.......................................................... 529B8-Filter .................................................................. 526Controller-Plugin ................................................ 532Kommentar-Modul anpassen ....................... 535Konfiguration ...................................................... 527Modelinfrastruktur ............................................ 527Modul einsetzen .................................................. 545Serviceklasse ........................................................ 530View-Helper .......................................................... 534Vorbereitungen ................................................... 526SpamCheck-Controller-Plugin ........................... 532SpamCheck-View-Helper ..................................... 534Spamfilter ................................................................... 526SQL-Abfragen ............................................................ 265Delete...................................................................... 268Insert ....................................................................... 268Join........................................................................... 266Select ........................................................................ 265Update ................................................................... 268SQLite3....................................................... 257, 259, 303Strategies .................................................................... 245FeedStrategy ................................................. 245, 311JsonStrategy.......................................................... 245PhpRendererStrategy ........................................ 245StringHtmlPurifier-Filter........................... 406, 427StringToUrl-Filter................................................... 404TTagwolke...................................................................... 313Template-Engines ................................................... 256TemplateMapResolver.......................................... 244TemplatePathStack ................................................ 244Translate-View-Helper .......................................... 292Translator ................................................................... 289Konfiguration ...................................................... 291Translator-Service.............................................. 292View-Helper .......................................................... 292Zend\Validator-Fehlermeldungen .............. 294TreeRouteStack ........................................................ 198Twitter Bootstrap ..................................... 70, 337, 391Alerts ....................................................................... 389Carousel ................................................................. 502Menleiste............................................................ 400UUrl-Plugin ................................................................... 225Url-View-Helper........................................................ 174UserIsAllowed-View-Helper .............................. 470UserShowWidget-View-Helper........................... 471VView-Helper............................................................... 248BasePath ................................................................ 249CmsContentBlock....................................... 553, 558CommentShowComments .............................. 513CommentShowLinks ........................................... 511CurrencyFormat ................................................. 397Cycle ........................................................................ 252Date ......................................................................... 393Doctype .................................................................. 249eigene View-Helper................................... 253, 388EscapeCss................................................................ 251EscapeHtml.................................................... 176, 251EscapeHtmlAttr ................................................... 251EscapeJs ................................................................... 251EscapeUrl ................................................................ 251Form ........................................................................ 334FormElement........................................................ 335FormRow ............................................................... 334GetOrder ................................................................ 586Gravatar ................................................................ 252HeadLink ............................................................... 249Index616View-Helper (Forts.)HeadMeta ............................................................. 249HeadScript ............................................................ 249HeadStyle.............................................................. 249HeadTitle............................................................... 249HtmlFlash .............................................................. 252HtmlList.................................................................. 252HtmlObject............................................................ 252HtmlPage ............................................................... 252HtmlQuicktime.................................................... 252InlineScript ............................................................ 252Json ........................................................................... 252Layout ..................................................................... 252Navigation .................................................. 299, 302PageTitle ............................................................... 388PaginationControl ............................................ 305Partial...................................................................... 252PartialLoop ........................................................... 252Placeholder ........................................................... 252RenderChildModel.............................................. 252RenderToPlaceholder ........................................ 252ServerUrl........................................................ 223, 250ShowBasket ........................................................... 581ShowForm.............................................................. 391ShowMessages .................................................... 389SpamCheck............................................................ 534Translate ................................................................ 292Url .................................................................... 174, 250UserIsAllowed ..................................................... 470UserShowWidget................................................. 471ViewModel............................................................. 252Widgets ................................................................... 253ViewModel ................................................................. 241Aktionsmethode.................................................. 241ConsoleModel ...................................................... 243FeedModel ..................................................... 243, 311JsonModel .............................................................. 243Listener ................................................................... 395Verschachtelung ................................................. 242ViewModel-View-Helper ...................................... 252View-Scripts ............................................................... 247Beispiel ........................................................... 174, 248Escaping ....................................................... 248, 250Templatevariablen............................................ 248View-Helper ......................................................... 248Virtual Host Linux .................................................... 57Virtual Host Windows ............................................. 59Voraussetzungen ...................................................... 53Apache 2-Konfiguration .................................... 57PHP-Extensions ..................................................... 54Voraussetzungen (Forts.)Virtual Host Linux ................................................ 57Virtual Host Windows ........................................ 59WWegweiser .................................................................... 28XXML-RPC ..................................................................... 374XSS ...................................................................... 248, 406ZZend Framework 1..................................................... 33Komponentenvergleich ..................................... 48Umsteiger ................................................................. 33Zend Framework 2..................................................... 27Anwendung einrichten ....................................... 53Einfhrung ............................................................... 27Installation .............................................................. 61Komponentenvergleich ..................................... 48Konzepte .................................................................. 40Links............................................................................ 31Nachteile ................................................................... 51Neuerungen ............................................................. 33Struktur ..................................................................... 71berblick ber die Komponenten ................. 29Versionsverwaltung ............................................ 39Voraussetzungen .................................................. 53Vorteile ..................................................................... 50Zend Framework 2-Links ........................................ 31Zend\Authentication ............................................. 361Authentifizierungsprozess ............................. 366Authentifizierungsservice..................... 365, 460Basic Authentication ......................................... 361Datenbank-Authentifizierung ...................... 363DbCrypt-Authentifizierungsadapter .......... 456Digest Authentication ...................................... 362HTTP-Authentifizierung ................................... 361Ldap ......................................................................... 368Login-Formular ................................................... 365Logout-Formular ................................................ 365Zend\Barcode ............................................................ 314Zend\Cache.................................................................. 92Capabilities ............................................................. 94Patterns .................................................................... 95Plugins ...................................................................... 94Storages ................................................................... 92Zend\Code ................................................................ 605Index617Zend\Config................................................................ 90ACL cachen ............................................................ 357Factory ...................................................................... 91Kaskadierendes Laden........................................ 82PHP-Array einlesen .............................................. 91Reader ...................................................................... 90Writer......................................................................... 91YAML-Untersttzung installieren.................. 91Zend\Console........................................................... 605Zend\Crypt................................................................. 376DbCrypt-Authentifizierungsadapter ......... 456Zend\Db ...................................................................... 257Datenbankadapter ............................................ 258RowGateway ........................................................ 278SQL-Abfragen ....................................................... 265TableGateway ....................................................... 271Zend\Db\Adapter .................................................... 258Entitt-Klasse ....................................................... 262Hydrator................................................................. 263Konfiguration ...................................................... 258Lesende Abfragen .............................................. 260Queries ................................................................... 260ResultSet................................................................. 262Schreibende Abfragen....................................... 261Statements ............................................................ 261Zend\Db\RowGateway.......................................... 278Daten lesen............................................................ 279Daten schreiben .................................................. 279Entitt-Klasse ...................................................... 280RowGatewayFeature............................... 275, 280Zend\Db\Sql .............................................................. 265Alter Table ............................................................ 270Create Table ......................................................... 270Delete...................................................................... 268Drop Table ............................................................ 270Insert ....................................................................... 268Join........................................................................... 266Select ........................................................................ 265Update ................................................................... 268Zend\Db\Sql\Ddl .................................................... 270Zend\Db\TableGateway ........................................ 271Beispiel .................................................................... 423Daten schreiben .................................................. 273Datenbankzugriffe loggen.............................. 275Entitt-Klasse ....................................................... 272EventFeature ........................................................ 275Formular ............................................................... 494GlobalAdapterFeature...................................... 275MasterSlaveFeature........................................... 275MetadataFeature................................................ 275RowGatewayFeature............................... 275, 280Zend\Db\TableGateway (Forts.)Verknpfungstabelle ........................................ 488Zend\Debug ............................................................. 605Zend\Di ........................................................................ 141Automatische Erkennung ................................ 141Definition kompilieren..................................... 144Konfiguration ....................................................... 147Tipps ........................................................................ 150Zend\Dom................................................................. 605Zend\Escaper ............................................................. 312Zend\EventManager............................................... 117Einfhrung ............................................................. 117EventManagerAwareInterface ...................... 118Listener Closures.................................................. 119Listener-Aggregate ............................................. 121MvcEvent ............................................................... 205Objekte injizieren ............................................... 432Parameter bergeben........................................ 124Zend\SharedEventManager............................ 124Zend\Feed ................................................................. 309FeedModel .............................................................. 311Feeds lesen ........................................................... 309Feeds schreiben ................................................... 310FeedStrategy ......................................................... 311Zend\Filter ................................................................. 103Beispiel.................................................................... 426Benutzereingaben filtern ................................ 427Eigene Filter ................................................ 107, 404Filterketten............................................................ 107Parameter bergeben....................................... 105Standardfilter ...................................................... 104Statische Filter ..................................................... 106Zend\Form................................................................. 322Annotationen ...................................................... 343Ausgabe mit View-Helpern ............................ 333Beispiel.......................................................... 428, 494Collections............................................................. 328Datei-Uploads...................................................... 346Einfhrung ............................................................ 323Factory........................................................... 324, 326Fieldset erweitern ............................................... 326Fieldsets.................................................................. 325Formularelemente .............................................. 331HTML5-Elemente ................................................ 332InputFilter ............................................................. 337InputFilterProviderInterface ......................... 338Konfiguration ...................................................... 324Objekt erstellen ................................................... 323Objekte anbinden .............................................. 340spezielle View-Helper........................................ 334Standardelemente .............................................. 331Index618Zend\Form (Forts.)Twitter Bootstrap ............................................... 337Upload durchfhren ......................................... 348Uploadformular .................................................. 347Validierung ........................................................... 337Validierungsgruppe ........................................... 338Zend\Http\Client ................................................... 369Authentifizierung ................................................ 371Cookies................................................................... 370HTTP-Anfrage versenden ............................... 369RESTful-Webservice testen .............................. 223Verbindungsadapter ........................................ 370Zend\I18n .................................................................. 289ext/intl ...................................................................... 56Translator ............................................................. 289Translator konfigurieren ................................. 291Translator-Service .............................................. 292View-Helper .......................................................... 292Zend\Validator Fehlermeldungen ..... 294, 402Zend\InputFilter ....................................................... 315eigenstndige Klasse......................................... 318Factory ..................................................................... 317InputFilterProviderInterface .......................... 338Input-Objekte ........................................................ 315Konfiguration ....................................................... 317Objekt erstellen..................................................... 315Zend\Json ................................................................... 312Zend\Ldap ................................................................. 368Zend\Loader ................................................................ 87ClassMap generieren........................................... 89ClassMapAutoloader .......................................... 88eigenen Autoloader erstellen.......................... 90StandardAutoloader ........................................... 88Zend\Log ...................................................................... 96Datenbankzugriffe loggen.............................. 275Fehler loggen ....................................................... 206Filter ........................................................................... 98Formatter................................................................. 98Logger....................................................................... 96Writer......................................................................... 98Zend\Mail .................................................................... 99E-Mail-Nachricht erstellen ............................. 100E-Mail-Nachricht versenden ......................... 100E-Mail-Nachrichten abrufen .......................... 102MIME-Nachrichten erstellen .......................... 101Zend\Math ................................................................ 605Zend\Memory ......................................................... 605Zend\Mime ................................................................ 101Zend\ModuleManager ........................................... 151Anwendungsmodul entwickeln .................... 169Assets ........................................................................ 155Zend\ModuleManager (Forts.)Autoloading .......................................................... 157Controller konfigurieren ................................. 164Controller-Plugins konfigurieren................. 166Einfhrung .............................................................. 151Fremdmodule ....................................................... 179Konfiguration ............................................... 155, 157Konfigurationsdaten ......................................... 158Konfigurationsschlssel ................................... 159Library-Modul ...................................................... 177Modulaufbau ........................................................ 152Modul-Klasse ........................................................ 153Services konfigurieren ....................................... 161Source-Verzeichnis ............................................. 156Tests .......................................................................... 156View-Helper konfigurieren .............................. 167Views ........................................................................ 157Weitere Konfigurationen ................................ 169Zend\Mvc .................................................................... 183Application ........................................................... 184Controller ............................................................... 211Controller, Beispiel............................................ 440Einfhrung ............................................................. 183Events ...................................................................... 205Routing ................................................................... 192Services ................................................................... 189Zend\Mvc\Application ......................................... 184Bootstrapping...................................................... 186Initialisierungsprozess ..................................... 184Verarbeitung ........................................................ 188Zend\Navigation ..................................................... 295Acl ............................................................................. 301Beispiel..................................................................... 415Container............................................................... 295Konfiguration ...................................................... 297Men im Seitenkopf .......................................... 399Mens ausgeben................................................ 300MVC-Seiten ........................................................... 296NavigationFactory ............................................ 299Routing ................................................................... 296Seiten ....................................................................... 295URI-Seiten.............................................................. 295View-Helper .......................................................... 299Zend\Paginator........................................................ 302Adapter................................................................... 303Paginierung .......................................................... 302Seitennavigation ................................................ 305Seitennavigation View-Script....................... 308Seitennavigation View-Skript ...................... 403View-Helper .......................................................... 305Index619Zend\Permissions\Acl .......................................... 355ACL abfragen ........................................................ 357ACL cachen ............................................................ 357ACL definieren...................................................... 355Autorisierungsservice ....................................... 461Benutzerrechte prfen ..................................... 476Privilegien .............................................................. 355Regeln ...................................................................... 355Ressourcen ............................................................ 355Rollen....................................................................... 355Zend\Navigation ................................................ 301Zend\Permissions\Rbac ....................................... 358Berechtigungen ................................................... 359Identitten............................................................. 358RBAC abfragen.................................................... 360RBAC definieren .................................................. 359Rollen....................................................................... 358Zend\ProgressBar.................................................. 606Zend\Serializer ................................................ 571, 606Zend\ServiceManager ............................................ 127AbstractFactories ...................................... 130, 138Aliases ..................................................................... 130Factories ......................................................... 130, 131Initializers ...................................................... 130, 135Instanziierungsarten ........................................ 130Invokables ............................................................. 130Konfigurationsdatei ........................................... 133Konfigurationsklasse ........................................ 132ServiceLocatorAwareInterface....................... 137Services ................................................................... 130Shared ..................................................................... 130Tipps........................................................................ 140Zend\Session.............................................................. 351Session-Container ............................................... 351Session-Manager ................................................ 352Sessions in der Datenbank speichern ......... 353Zend\Soap ................................................................... 371AutoDiscover ........................................................ 372Client einsetzen ................................................... 373Server bereitstellen.............................................. 371Zend\Soap (Forts.)WSDL-Caching abschalten .............................. 371Zend\Stdlib ................................................................. 377Hydrator ................................................................. 377Zend\Tag...................................................................... 313Zend\Text.................................................................. 606Zend\Uri .................................................................... 606Zend\Validator......................................................... 108eigenen Validator erstellen ............................. 113Fehlermeldungen anpassen ............................. 115Fehlermeldungen bersetzen .............. 294, 402Parameter bergeben........................................ 110Standardvalidatoren ........................................ 109Statische Validatoren ......................................... 111Validatorketten.................................................... 112Zend\Version ........................................................... 606Zend\View.................................................................. 237Ablauf...................................................................... 238Beispiel.................................................................... 239Konfiguration ..................................................... 240Layout ..................................................................... 395Renderer ................................................................. 245Resolver .................................................................. 244Strategies ............................................................... 245Teilkomponenten ............................................... 237Template-Engines .............................................. 256View-Helper .......................................................... 248ViewModel ............................................................. 241View-Scripts .......................................................... 247View-Scripts, Beispiel ............................... 443, 447Zend\XmlRpc............................................................ 374Caching ................................................................... 375Client einsetzen .................................................... 375Server bereitstellen ............................................ 374ZendDeveloperTools .............................................. 179ZfcBase.......................................................................... 181ZfcTwig ........................................................................ 256ZfcTwitterBootstrap............................................... 337ZfcUser ......................................................................... 181ZFTool ............................................................................ 69Zielgruppe .................................................................... 28Galileo Computing LeseprobeZend Framework 2Ralf Eggert--------------------------------------------Auf einen BlickInhalt--------------------------------------------Kapitel 2: Neuerungen im Zend Framework 22.1 Begrifflichkeiten2.2 PHP-Version2.2.1 PHP-Namespaces2.2.2 Closures2.2.3 Late Static Binding2.3 Git und GitHub2.4 Neue Konzepte2.4.1 Verbesserte Modularitt2.4.2 Dependency Injection2.4.3 Service-Locator2.4.4 Ereignisgesteuerte Architektur2.5 Komponentenvergleich2.6 Vor- und Nachteile des ZF2Kapitel 13:Benutzermanagement13.1 Zend\Session13.1.1 Mit Session-Containern arbeiten13.1.2 Session-Manager verwenden13.1.3 Sessions in der Datenbank speichern13.2 Zend\Permissions\Acl13.2.1 Begrifflichkeiten13.2.2 ACL definieren13.2.3 ACL abfragen13.2.4 ACL cachen13.3 Zend\Permissions\Rbac13.3.1 Begrifflichkeiten13.3.2 RBAC definieren13.3.3 RBAC abfragen13.4 Zend\Authentication13.4.1 Per HTTP authentifizieren13.4.2 Gegen eine Datenbanktabelle authentifizieren13.4.3 Authentifizierungsservice13.5 Zend\Ldap--------------------------------------------Index--------------------------------------------www.galileocomputing.de Galileo Press GmbH 2013 /ColorImageDict > /JPEG2000ColorACSImageDict > /JPEG2000ColorImageDict > /AntiAliasGrayImages false /CropGrayImages false /GrayImageMinResolution 150 /GrayImageMinResolutionPolicy /OK /DownsampleGrayImages true /GrayImageDownsampleType /Average /GrayImageResolution 200 /GrayImageDepth -1 /GrayImageMinDownsampleDepth 2 /GrayImageDownsampleThreshold 1.50000 /EncodeGrayImages true /GrayImageFilter /DCTEncode /AutoFilterGrayImages true /GrayImageAutoFilterStrategy /JPEG /GrayACSImageDict > /GrayImageDict > /JPEG2000GrayACSImageDict > /JPEG2000GrayImageDict > /AntiAliasMonoImages false /CropMonoImages false /MonoImageMinResolution 300 /MonoImageMinResolutionPolicy /OK /DownsampleMonoImages true /MonoImageDownsampleType /Bicubic /MonoImageResolution 300 /MonoImageDepth -1 /MonoImageDownsampleThreshold 1.50000 /EncodeMonoImages true /MonoImageFilter /CCITTFaxEncode /MonoImageDict > /AllowPSXObjects true /CheckCompliance [ /None ] /PDFX1aCheck false /PDFX3Check false /PDFXCompliantPDFOnly false /PDFXNoTrimBoxError true /PDFXTrimBoxToMediaBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXSetBleedBoxToMediaBox true /PDFXBleedBoxToTrimBoxOffset [ 0.00000 0.00000 0.00000 0.00000 ] /PDFXOutputIntentProfile (U.S. Web Coated \050SWOP\051 v2) /PDFXOutputConditionIdentifier (CGATS TR 001) /PDFXOutputCondition () /PDFXRegistryName (http://www.color.org) /PDFXTrapped /False /CreateJDFFile false /Description > /Namespace [ (Adobe) (Common) (1.0) ] /OtherNamespaces [ > /FormElements false /GenerateStructure false /IncludeBookmarks false /IncludeHyperlinks false /IncludeInteractive false /IncludeLayers false /IncludeProfiles false /MarksOffset 6 /MarksWeight 0.250000 /MultimediaHandling /UseObjectSettings /Namespace [ (Adobe) (CreativeSuite) (2.0) ] /PDFXOutputIntentProfileSelector /UseName /PageMarksFile /RomanDefault /PreserveEditing false /UntaggedCMYKHandling /UseDocumentProfile /UntaggedRGBHandling /LeaveUntagged /UseDocumentBleed false >> > ]>> setdistillerparams> setpagedevice