Beruflich Dokumente
Kultur Dokumente
Zend Framework 2
Das Praxisbuch
Die Grundlagen
27
33
53
TEIL II
Die Komponenten
Basis-Komponenten .............................................................................................
10
11
12
13
14
TEIL III
87
Die Module
15
16
17
18
19
20
21
22
Inhalt
Inhalt
Geleitwort ..............................................................................................................................................
Vorwort ..................................................................................................................................................
Vorwort des Autors zur Vorauflage ..............................................................................................
TEIL I
19
21
23
Die Grundlagen
27
1.1
27
1.2
28
1.3
Wegweiser ................................................................................................................
28
1.4
29
1.5
31
1.6
31
1.7
32
33
2.1
Begrifflichkeiten ......................................................................................................
33
2.2
PHP-Version ..............................................................................................................
PHP-Namespaces .......................................................................................
Closures .......................................................................................................
Late Static Binding .....................................................................................
34
34
36
38
2.3
39
2.4
2.2.1
2.2.2
2.2.3
2.4.1
2.4.2
2.4.3
2.4.4
Service-Locator ...........................................................................................
Ereignisgesteuerte Architektur ................................................................
40
40
41
43
45
2.5
Komponentenvergleich .........................................................................................
48
2.6
50
5
Inhalt
53
3.1
Voraussetzungen ....................................................................................................
53
53
54
57
57
59
60
3.1.1
3.1.2
3.1.3
3.1.4
3.1.5
3.1.6
3.2
3.3
3.2.3
3.4
PHP-Version ................................................................................................
PHP-Extensions ..........................................................................................
Apache 2-Konfiguration ............................................................................
Virtual Host einrichten unter Linux .........................................................
Virtual Host einrichten unter Windows ..................................................
Weitere Informationen .............................................................................
TEIL II
Hauptverzeichnis .......................................................................................
Das Konfigurationsverzeichnis .................................................................
Das Public-Verzeichnis ..............................................................................
Vendor-Verzeichnis ....................................................................................
Das Modulverzeichnis ...............................................................................
Kaskadierendes Laden der Konfigurationsdaten ...................................
Autoloading mit Composer ......................................................................
61
61
62
65
68
69
69
70
71
71
73
74
76
77
82
83
Die Komponenten
Basis-Komponenten
87
4.1
Zend\Loader .............................................................................................................
87
88
88
89
90
4.1.1
4.1.2
4.1.3
4.1.4
4.2
Zend\Config .............................................................................................................
4.2.1
4.2.2
StandardAutoloader ..................................................................................
ClassMapAutoloader .................................................................................
AutoloaderFactory .....................................................................................
Eigenen Autoloader erstellen ...................................................................
Konfigurationsdateien lesen ....................................................................
Konfigurationsdateien schreiben ............................................................
90
90
91
Inhalt
4.3
4.4
4.5
Zend\Cache ..............................................................................................................
4.3.1
Cache-Storages ..........................................................................................
4.3.2
4.3.3
Zend\Log ...................................................................................................................
4.4.1
4.4.2
4.4.3
4.4.4
Formatter ....................................................................................................
Filter .............................................................................................................
4.6
Zend\Filter ................................................................................................................
4.6.1
4.6.2
4.6.3
4.6.4
4.7
Zend\Validator ........................................................................................................
4.7.1
4.7.2
4.7.3
4.7.4
4.7.5
Standardvalidatoren ..................................................................................
Statische Validatoren ................................................................................
Validatorketten ..........................................................................................
Eigenen Validator erstellen .......................................................................
Validator-Fehlermeldungen anpassen ....................................................
92
92
94
95
96
97
98
98
98
99
100
100
101
102
103
104
106
107
107
108
109
111
112
113
115
Der Event-Manager
117
5.1
Einfhrung ................................................................................................................
117
5.2
EventManagerAwareInterface .............................................................................
118
5.3
119
5.4
121
5.5
124
5.6
SharedEventManager .............................................................................................
124
Inhalt
127
6.1
Zend\ServiceManager ............................................................................................
127
128
130
131
132
133
135
137
140
6.1.1
6.1.2
6.1.3
6.1.4
6.1.5
6.1.6
6.1.7
6.1.8
6.2
Beispielklassen ...........................................................................................
Untersttzte Instanziierungsarten ..........................................................
Den Service-Manager konfigurieren ........................................................
Konfigurationsklasse .................................................................................
Konfigurationsdatei ...................................................................................
Initializer einrichten ..................................................................................
Abstrakte Fabrik verwenden .....................................................................
Den Service-Manager richtig nutzen .......................................................
Zend\Di .....................................................................................................................
6.2.1
6.2.2
6.2.3
6.2.4
141
141
144
147
150
Der Modul-Manager
151
7.1
Einfhrung ................................................................................................................
151
7.2
152
153
155
155
156
156
157
7.2.1
7.2.2
7.2.3
7.2.4
7.2.5
7.2.6
7.3
Modulkonfiguration ...............................................................................................
7.3.1
7.3.2
7.3.3
7.3.4
7.3.5
7.3.6
7.3.7
7.4
157
157
158
161
164
166
167
169
169
Die Modul-Klasse ....................................................................................... 170
Modulkonfiguration .................................................................................. 171
Inhalt
173
175
7.5
177
7.6
7.4.3
7.4.4
7.6.1
7.6.2
179
Die ZendDeveloperTools mit Composer installieren ............................. 179
ZfcUser und ZfcBase mit Git klonen ........................................................ 181
MVC-Komponenten
183
8.1
Einfhrung ................................................................................................................
183
8.2
Application ...............................................................................................................
Initialisierungsprozess ...............................................................................
Bootstrapping .............................................................................................
Der Verarbeitungsprozess .........................................................................
184
184
186
188
8.3
Services ......................................................................................................................
189
8.4
Routing ......................................................................................................................
192
192
193
194
195
196
197
198
201
203
8.2.1
8.2.2
8.2.3
8.5
8.4.1
8.4.2
8.4.3
8.4.4
8.4.5
Route-Typen ...............................................................................................
Der Route-Typ Hostname ......................................................................
Der Route-Typ Literal .............................................................................
Der Route-Typ Regex .............................................................................
Der Route-Typ Segment ........................................................................
8.4.6
8.4.7
8.4.8
8.4.9
SimpleRouteStack ......................................................................................
TreeRouteStack ..........................................................................................
Routing konfigurieren ...............................................................................
Routing-Tipps .............................................................................................
Events ........................................................................................................................
8.5.1
8.5.2
8.5.3
8.6
Controller ..................................................................................................................
8.6.1
8.6.2
8.6.3
8.6.4
8.6.5
8.7
Controller-Plugins ...................................................................................................
8.7.1
205
205
206
209
211
211
212
214
215
218
224
224
9
Inhalt
8.7.2
8.7.3
8.7.4
8.7.5
8.7.6
8.7.7
8.7.8
8.7.9
8.7.10
225
225
227
227
229
229
231
233
234
View-Komponenten
237
9.1
237
237
238
240
9.1.1
9.1.2
9.1.3
9.2
ViewModels ..............................................................................................................
9.2.1
9.2.2
9.3
Bestandteile ................................................................................................
Teilkomponenten .......................................................................................
Konfiguration .............................................................................................
ViewModels verschachteln .......................................................................
Weitere View-Models ................................................................................
241
242
243
244
244
Renderer ...................................................................................................... 245
Strategies .................................................................................................... 245
Resolver .......................................................................................................
9.4
View-Scripts ..............................................................................................................
247
9.5
View-Helper ..............................................................................................................
View-Helper fr HTML-Kopfdaten ...........................................................
View-Helper fr URLs .................................................................................
View-Helper fr das Escaping ...................................................................
Weitere View-Helper .................................................................................
Einen eigenen View-Helper erstellen ......................................................
248
249
250
250
251
253
Template-Engines ...................................................................................................
256
9.5.1
9.5.2
9.5.3
9.5.4
9.5.5
9.6
10 Datenbank-Komponenten
257
257
258
10
Inhalt
10.2.1
10.2.2
10.2.3
10.2.4
258
260
Ausfhren von schreibenden Abfragen .................................................. 261
ResultSet fr Adapter konfigurieren ........................................................ 262
265
265
268
270
271
Zend\Db\TableGateway ........................................................................... 271
TableGateway-Features ............................................................................ 274
Zend\Db\RowGateway ............................................................................. 278
11 Ausgabe-Komponenten
281
281
282
286
289
289
Translator .................................................................................................... 289
View-Helper ................................................................................................ 292
Fehlermeldungen fr Zend\Validator bersetzen ................................. 294
295
295
297
299
301
302
303
305
309
Feeds lesen .................................................................................................. 309
Feeds schreiben .......................................................................................... 310
Feeds mit Zend\Mvc und Zend\View ...................................................... 311
Zend\Escaper ..............................................................................................
312
312
11
Inhalt
11.5.2
11.5.3
11.5.4
Zend\Json ...................................................................................................
Zend\Tag .....................................................................................................
312
313
Zend\Barcode ............................................................................................. 314
12 Formularverarbeitung
315
315
315
317
318
320
322
12.1.1
12.1.2
12.1.3
12.1.4
12.1.5
Einfhrung ..................................................................................................
Ein Form-Objekt erstellen .........................................................................
Fieldsets ......................................................................................................
Collections ..................................................................................................
Elemente .....................................................................................................
Ausgabe mit View-Helpern .......................................................................
Validierung von Formularen .....................................................................
Objekte anbinden ......................................................................................
Annotationen .............................................................................................
Datei-Uploads ............................................................................................
13 Benutzermanagement
322
323
323
325
328
331
333
337
340
343
346
351
351
Mit Session-Containern arbeiten ............................................................. 351
Session-Manager verwenden ................................................................... 352
Sessions in der Datenbank speichern ...................................................... 353
Begrifflichkeiten .........................................................................................
ACL definieren ............................................................................................
ACL abfragen ..............................................................................................
ACL cachen ..................................................................................................
12
Begrifflichkeiten .........................................................................................
355
355
355
357
357
358
358
Inhalt
13.3.2
13.3.3
359
360
361
361
363
Authentifizierungsservice ......................................................................... 365
Per HTTP authentifizieren .........................................................................
Gegen eine Datenbanktabelle authentifizieren .....................................
368
14 Sonstige Komponenten
369
369
369
370
370
14.1.1
14.1.2
14.1.3
371
SOAP-Server bereitstellen ......................................................................... 371
SOAP-Client einsetzen ............................................................................... 373
374
374
375
376
377
14.3.1
14.3.2
TEIL III
Die Module
15 Das Anwendungsmodul
383
383
384
388
388
389
391
393
15.3.1
15.3.2
15.3.3
15.3.4
13
Inhalt
395
399
401
402
403
404
404
406
407
409
16 Das Blog-Modul
411
411
412
15.9.1
15.9.2
15.9.3
419
Datenbank einrichten ................................................................................ 419
Klassen erstellen ........................................................................................ 421
425
426
427
429
431
Formular-Objekte injizieren ...................................................................... 432
Der Blog-Service berblick ..................................................................... 433
440
440
443
444
445
447
451
16.7.1
16.7.2
14
Inhalt
17 Das Benutzer-Modul
453
453
454
455
456
460
461
464
466
17.3.1
17.3.2
17.3.3
17.3.4
470
Der View-Helper UserIsAllowed ........................................................... 470
Der View-Helper UserShowWidget ..................................................... 471
475
478
478
481
17.7.1
17.7.2
18 Das Pizza-Modul
483
483
484
485
490
494
498
501
502
19 Das Kommentar-Modul
505
505
506
15
Inhalt
508
511
511
513
516
519
521
20 Das Spamabwehr-Modul
525
525
526
527
529
530
532
534
535
536
537
537
539
542
545
21 Das CMS-Modul
549
549
550
551
552
553
553
19.4.1
19.4.2
19.4.3
20.8.1
20.8.2
20.8.3
20.8.4
20.8.5
21.2.1
21.2.2
21.2.3
21.2.4
16
Konfiguration .............................................................................................
CMS-Service ................................................................................................
Textblcke ...................................................................................................
View-Helper zur Ausgabe von Textblcken ............................................
Inhalt
555
556
558
560
562
22 Das Shop-Modul
565
565
566
567
573
576
580
581
22.7.1 Der View-Helper ShowBasket ............................................................. 581
22.7.2 Der View-Helper GetOrder .................................................................. 586
587
589
593
594
Anhang
599
601
601
602
602
603
605
Performance-Tipps ..................................................................................................
C.1
Autoloader ClassMap ..............................................................................
607
607
17
Inhalt
TemplateMap ............................................................................................
Die Modul-Konfiguration cachen .........................................................
Weitere Caches .........................................................................................
607
608
608
Index ........................................................................................................................................................
611
C.2
C.3
C.4
18
Kapitel 2
Neuerungen im Zend Framework 2
Viele Umsteiger vom Zend Framework 1 sind besonders an den Neuerungen interessiert, die das Zend Framework 2 mit sich bringt. Fr Umsteiger hat sich im ZF2 einiges
gendert, sodass sie sich auf einen erneuten Lernaufwand einstellen mssen. Diese
Hrde sollte jedoch niemanden abschrecken. Wer sich einmal in die neuen Konzepte
und Komponenten eingearbeitet hat, der wird sie zuknftig nicht mehr missen wollen. Die grten Probleme treten am ehesten auf, wenn eine viel genutzte ZF1-Komponente im ZF2 nicht mehr zum Framework-Kern gehrt. In solch einem Fall knnen
Sie bei Bedarf zumindest bergangsweise immer noch die ZF1-Komponenten verwenden.
Dieses Kapitel fasst die wesentlichen nderungen beim Umstieg vom ZF1 auf das ZF2
zusammen. Wenn Sie sich bereits mit dem ZF1 auskennen, sollten Sie sich dieses
Kapitel aufmerksam durchlesen. Einsteiger ins Zend Framework 2 sollten die
Abschnitte ber PHP 5.3, Git und GitHub sowie die neuen Konzepte genauer in
Augenschein 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
Begrifflichkeiten
Einige Begriffe werden in diesem Buch von Beginn an sehr hufig gebraucht, auch
wenn diese im ZF1 fr den Anwender nicht ganz so allgegenwrtig waren, wie sie es
im ZF2 sind.
Interfaces wurden bereits im ZF1 an vielen Stellen eingesetzt. Wenn Sie das ZF2 einsetzen, kommen Sie damit hufiger in Berhrung. Ein Interface gibt vor, welche
Methoden mit welchen Parametern in einer Klasse vorhanden sein mssen, wenn
diese Klasse das Interface implementiert. Fr Klassen, die von anderen Klassen verwendet werden, wird empfohlen, ein Interface als Basis zu erschaffen und dieses
auch in den Methodensignaturen zu verwenden. Es heit also nicht:
function bakePizza(Pizza $pizza)
sondern:
33
Die Aufgabe von Factories ist es, ein Objekt zu erstellen. Dabei wird nicht einfach der
Konstruktor dieser Klasse aufgerufen. Sondern es wird die Factory aufgerufen, die
verschiedene Vorbereitungen trifft, um dann den Konstruktor aufzurufen. Diese
Vorbereitungen sind in der Regel die Bereitstellung von anderen Objekten, die der
Konstruktor bei der Initialisierung bentigt. Factories knnen als Klassen, Methoden
oder Closures implementiert sein.
In einer Modelinfrastruktur kann es verschiedene Bestandteile geben. Eine Entitt
stellt dabei ein einfaches Objekt, wie z. B. eine Pizza, ein Buch oder einen Blogbeitrag
dar. Eine Datenquelle ist dafr zustndig, die Daten fr eine Entitt aus einer Datenbank oder einer anderen Datenquelle zu lesen. Um die Daten aus einer Datenquelle
an eine Entitt zu bergeben, bedarf es eines Mappers. Ein Hydrator ist ebenfalls eine
Art Mapper, der Daten eines Arrays an ein Objekt bergeben kann und umgekehrt.
Ein Model-Service hlt alles zusammen. Er kommuniziert mit Datenquellen und
Mappern, verarbeitet Entitten, setzt Hydratoren ein und stellt eine Schnittstelle
bereit, damit Controller auf die Modelinfrastruktur zugreifen knnen.
2.2
PHP-Version
Die augenscheinlichste Neuerung ist der Wechsel auf PHP 5.3 als Mindestanforderung fr das Zend Framework 2. Setzte das Zend Framework 1 noch PHP 5.2 voraus, so
konnten durch den Umstieg auf PHP 5.3 eine Vielzahl neuer Funktionen genutzt werden. Der Zend Framework 2-Nutzer kommt am ehesten mit dem Einsatz von
Namensrumen und der Verwendung von Closures in Berhrung. Das Zend Framework 2 macht aber auch regen Gebrauch vom Late Static Binding. Trotz allem sollten
Sie neue Projekte am besten gleich auf PHP 5.4 aufsetzen, da auch PHP 5.3 langsam in
die Jahre gekommen ist.
2.2.1
PHP-Namespaces
In PHP 5.2 wurden keine Namensrume untersttzt. Deshalb wurden im Zend Framework 1 knstliche Namensrume geschaffen, um die Klassen auf die Dateiebene
abbilden zu knnen. Ein Beispiel: Die Klasse Zend_Loader_Autoloader ist im Zend
Framework 1 in der Datei /library/Zend/Loader/Autoloader.php abgelegt. Durch
diese knstlichen Namensrume wird sichergestellt, dass es nicht zu Namenskollisionen mit anderen Autoloader-Klassen aus anderen Bibliotheken kommt.
PHP 5.3 bietet echte Namensrume, sodass im Zend Framework 2 das Abbilden von
Klassen auf Dateiebene vereinfacht wird. Die neue Klasse StandardAutoloader gehrt
34
2.2
PHP-Version
zum 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 1
befindet sich die Klasse Zend_Config in der Datei /library/Zend/Config.php. Im Zend
Framework 2 drfen im /library/Zend/-Verzeichnis keine Dateien liegen. Die quivalente Klasse Config gehrt somit zum Namensraum Zend\Config und befindet sich in
der Datei /library/Zend/Config/Config.php.
In Listing 2.1 ist auszugsweise die besagte Klasse Config zu sehen. Oben wird mit dem
Schlsselwort namespace der Namensraum definiert, zu dem die Klasse gehrt. Mithilfe des Schlsselwortes use werden andere Namensrume importiert, damit Klassen und Interfaces aus diesen Namensrumen in unserer Klasse verwendet werden
knnen. Bei den Namensrumen ArrayAccess, Countable und Iterator handelt es
sich 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-Klasse
Die Verwendung der Namensrume ist jedoch nicht auf die Zend Framework 2-Bibliothek beschrnkt. Auch in den Klassen und Anwendungsmodulen knnen und sollten
Entwickler 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. Dieser
Klasse wurde der Namensraum Application\Controller zugewiesen. Die Klasse
importiert vier Namensrume, von denen zwei zur Zend Framework 2-Bibliothek
gehren und die beiden anderen zu einem Blog-Modul. Mithilfe des Schlsselworts
as kann einem Namensraum auch ein Alias gegeben werden. Dies ist erforderlich, da
es ansonsten zwischen den beiden Klassen Blog\Service\Blog und Blog\Options\
Blog zu Namenskollisionen kommen knnte.
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
35
use 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-Controller
ZF1-Umsteiger und ZF2-Einsteiger werden gleichermaen die Vorteile der Namensrume schnell zu schtzen wissen und ihre Anwendung darauf aufbauen wollen.
2.2.2
Closures
Eine Closure ist eine anonyme Funktion, die z. B. einer Variable zugeordnet werden
kann. Sie wird als anonym bezeichnet, da diese Funktion keinen Namen hat, durch
den sie aufgerufen werden knnte.
Listing 2.3 zeigt ein einfaches Beispiel. Der Variablen $pizzaPrice wird eine Closure
zugewiesen. Diese Funktion nimmt die Anzahl der Zutaten entgegen und ermittelt
damit den Preis einer Pizza, indem zu einem Grundpreis nochmals der Preis pro
Zutat hinzuaddiert wird. Der Aufruf dieser Closure erfolgt dann direkt ber die Variable $pizzaPrice, die als Funktion verwendet werden kann.
$pizzaPrice = function($items) {
return 3.95 + $items * 0.95;
};
echo $pizzaPrice(3); // output 6.8
echo $pizzaPrice(7); // output 10.6
Listing 2.3 Beispiel fr eine einfache Closure-Definition
Eine Closure kann aber beim Aufruf nicht nur variable Parameter bergeben bekommen. Es ist auch mglich, bei der Definition Variablen mithilfe des Schlsselwortes
use zu bergeben, die dann als fixe Werte verwendet werden knnen. Listing 2.4 zeigt
das genderte Beispiel, bei dem die Werte fr den Grundpreis und den Preis pro Zutat
bei der Definition der Funktion bergeben werden:
$basePrice = 3.95;
$itemPrice = 0.95;
$pizzaPrice = function($items) use ($basePrice, $itemPrice) {
return $basePrice + $items * $itemPrice;
36
2.2
PHP-Version
};
echo $pizzaPrice(2); // output 5.85
echo $pizzaPrice(6); // output 9.65
Closures knnen aber nicht nur an Variablen bergeben werden, sondern auch als
Parameter an andere Funktionen oder Klassenmethoden bergeben werden. In Listing 2.5 werden zuerst einige Pizza-Klassen definiert sowie eine Sammlung von PizzaObjekten erstellt. Um nur die Salami-Pizzen auszufiltern, wird das Objekt $pizzaList
an die array_filter()-Methode bergeben. Zudem wird eine Closure als CallbackFunktion bergeben, die true zurckgibt, wenn der Wert eine Instanz von PizzaSalami ist, und andernfalls false. Bei der Ausgabe werden nur die beiden Instanzen
von 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 Funktion
Somit knnen wir Closures auch fr alle PHP-Funktionen verwenden, die eine Callback-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 von
Factories fr den Service-Manager (siehe Abschnitt 6.1, Zend\ServiceManager).
37
2.2.3
Die Methodik das Late Static Binding (spte statische Bindung) lst ein Problem bei
erweiterten Klassen mit statischen Methoden und Eigenschaften, das in Listing 2.6
demonstriert wird. Die Klasse PizzaSalami definiert drei Methoden. Die Methode
getNameSelf() greift ber das Schlsselwort self auf die Methode name() zu, whrend
die Methode getNameStatic() das Schlsselwort static verwendet. Die Klasse PizzaSalamiPeperoni erweitert die Klasse PizzaSalami und berschreibt die Methode
name(). Der Unterschied in der Funktionsweise tritt beim Aufruf der Methode PizzaSalamiPeperoni::getNameStatic() am Ende des Listings auf. Dort wird nmlich der
richtige Name der PizzaSalamiPeperoni ausgegeben. Dieses Verhalten war in PHP 5.2
nicht 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 Binding
Die Methodik des Late Static Binding wird in der Zend Framework 2-Bibliothek recht
hufig verwendet. Als Nutzer des Zend Framework 2 kommen Sie damit nur in
Berhrung, wenn Sie es in ihren eigenen Klassen verwenden mchten.
38
2.3
2.3
http://try.github.com/
Ein schn gemachtes, interaktives Tutorial fr den allgemeinen Einstieg in Git und
GitHub
39
http://framework.zend.com/wiki/x/vYFZAQ
Im Zend Framework 2-Wiki gibt es einen Git Guide, mit dem sich der Entwickler
mit den wichtigsten Befehlen und Funktionen von Git und GitHub vertraut
machen kann.
http://de.gitready.com/
Die Website bietet viele Tipps und Tricks auf Deutsch zum Lernen von Git auch
fr fortgeschrittene Themen.
Im weiteren Verlauf des Buches werden wir bei der Installation der SkeletonApplication und bei Fremdmodulen sowie beim Einrichten eigener Repositories auf die
grundlegenden Befehle und Funktionen von Git nher eingehen.
2.4
Neue Konzepte
2.4.1
Verbesserte Modularitt
Im Zend Framework 1 gab es bereits Module. Doch diese waren eher Brger zweiter
Klasse (second-class citizens). Die Konfiguration der Module war mhsam, und ein
Austausch von Modulen zwischen mehreren Anwendungen war aufgrund von
Abhngigkeiten nicht ohne Weiteres mglich. Im Wesentlichen waren Module im
ZF1 nur Container fr Action-Controller, View-Scripts und fr weitere Klassen des
Moduls.
Im Zend Framework 2 sind die Module nun Brger erster Klasse. Das bedeutet, dass
im Prinzip alles ein Modul ist. Selbst die Zend Framework 2-Bibliothek kann als
Modul betrachtet werden. Somit braucht jede Zend Framework 2-Anwendung immer
mindestens ein Anwendungsmodul, das aber vom Entwickler vollkommen frei konfiguriert werden kann. Dies bringt viele Freiheiten, bedeutet aber auch einen gewissen Aufwand bei der Einrichtung einer neuen Zend Framework 2-Anwendung.
40
2.4
Neue Konzepte
2.4.2
Dependency Injection
Der Begriff der Dependency Injection definiert ein Entwurfsmuster, das die Steuerung der Abhngigkeiten zwischen Objekten lst. Ohne Dependency Injection werden Abhngigkeiten von Objekten meistens hart codiert in den Code aufgenommen.
Listing 2.7 demonstriert ein Beispiel mit festen Abhngigkeiten. Diese Pizza Salami
wird mit den drei festen Belgen Salami, Kse und Tomatenpampe belegt, und der
Pizzaboden ist aus Weizenmehl gemacht. Mchte ein Kunde nun doppelt Kse, Elchsalami oder einen Pizzaboden aus Dinkelmehl, kann Luigi diese Wnsche nicht im
System 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 Pizzaboden
41
Die Lsung fr das Problem der hart codierten Abhngigkeiten ist in Listing 2.8 zu
sehen. Der Konstruktor nimmt einen Parameter entgegen, der das CrustInterface
implementiert. Wenn unsere Klassen CrustWheatFlour und CrustSpeltFlour dieses
Interface implementieren, sind wir flexibel beim Austausch des Pizzabodens. Anstatt
die Belge in einem Array an den Konstruktor zu bergeben, wurde eine eigene
Methode addTopping() implementiert. Diese Methode nimmt einen Parameter entgegen, der das ToppingInterface implementieren muss. Somit knnen wir nicht nur
die Belge selber, sondern auch die Anzahl der Belge bequem variieren. Am Ende
des Listings wird unsere Pizza Salami instanziiert. Dabei wird unser Pizzaboden aus
Weizenmehl bergeben, und danach werden die Belge hinzugefgt. Auch die Spezialpizza mit Elchsalami, doppelt Kse und einem Pizzaboden aus Dinkelmehl ist nun
kein Problem mehr.
class Pizza
{
public function __construct(CrustInterface $crust)
{
$this->crust = $crust;
}
public function addTopping(ToppingInterface $topping)
{
$this->toppings[] = $topping;
}
}
$pizzaSalami = new Pizza(new
$pizzaSalami->addTopping(new
$pizzaSalami->addTopping(new
$pizzaSalami->addTopping(new
CrustWheatFlour());
ToppingSalami());
ToppingCheese());
ToppingTomatoStodge());
CrustSpeltFlour());
ToppingElkSalami());
ToppingCheese());
ToppingCheese());
ToppingTomatoStodge());
Listing 2.8 Klasse fr Pizza mit variablen Belgen und variablem Pizzaboden
Diese Vorgehensweise ist nicht nur beim Belegen von Pizzen hilfreich. Auch das Testen der Anwendung wird dadurch stark vereinfacht. Denn solange unsere Belge das
Interface ToppingInterface implementieren, knnen wir diese Klasse auch mit MockObjekten (Dummy-Objekten oder Attrappen) befllen. Solange Luigi am Ende keine
42
2.4
Neue Konzepte
Pizza mit Gel-Schinken und Kunst-Kse ausliefert, kann das Mocken der Belge beim
Testen durchaus akzeptabel und sinnvoll sein.
In Abschnitt 6.2, Zend\Di, wird die Zend Framework 2-Implementation des Entwurfsmusters Dependency Injection ausfhrlich dargestellt.
2.4.3
Service-Locator
Wer im Zend Framework 1 gerne und viel mit der Zend_Registry gearbeitet hat, der
wird berrascht sein. Im Zend Framework 2 gibt es keine zentrale Registry mehr, in
der Sie nach Lust und Laune ihre Objekte und Daten ablegen knnen. Das Zend
Framework 2 stellt aber etwas viel Besseres bereit: den Service-Locator. Beim ServiceLocator handelt es sich auch um ein Entwurfsmuster fr eine zentrale Registrierung
von Objekten zur spteren Nutzung. Es funktioniert hnlich wie die Registry, nur
dass sich der Service-Locator auch um die Instanziierung der Objekte kmmert.
In Listing 2.9 wird das Prinzip des Service-Locators mit einer eigenen Implementation dargestellt. Die Klasse ServiceLocator verfgt ber drei Methoden zum Initialisieren, Hinzufgen und Holen von Services. Die Methode set() nimmt einen
Bezeichner und den Namen der Klasse entgegen, instanziiert die Klasse und legt sie
fr den spteren Zugriff ab. Die Methode get() gibt mithilfe des Bezeichners die
Instanz zurck. Unter der Klassendeklaration wird der ServiceLocator zuerst mit den
notwendigen Services gefttert. Am Ende des Listings wird unsere Salamipizza mit
Pizzaboden und Belgen erstellt, die aus dem Service-Locator geholt und nicht direkt
instanziiert 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');
43
$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-Locators
Wie oben erwhnt wurde, ist dieses Beispiel funktional stark reduziert, und der Mehraufwand 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. Denken
Sie statt an Kse und Salami einmal an komplexere Services fr Authentifizierung,
Mailversand oder Logging. Diese Objekte werden wiederum andere Objekte fr die
Instanziierung bentigen, die wiederum andere Objekte bentigen. Statt eines einfachen Klassennamens kann ein Service-Locator (wie im nchsten Beispiel zu sehen)
auch eine Closure bergeben bekommen, die sich um die Instanziierung der Objekte
kmmert.
Listing 2.10 zeigt den genderten Service-Locator, an dem nur die set()-Methode verndert wurde. Statt eines Strings nimmt sie nun eine Instanz des Closure-Objekts
entgegen. Der Service wird angelegt, indem die Closure ausgefhrt wird. Weiter
unten wird die Closure-Methode definiert und an die Variable $factoryClosure bergeben. In der Funktion wird unsere Pizza auf dem klassischen Weg instanziiert und
belegt. Diese Closure-Funktion wird nun an das ServiceLocator-Objekt bergeben
und dabei ausgefhrt. Zum Abschluss wird die Instanz vom Service-Locator angefordert und ausgegeben. Wir erhalten dabei eine Instanz von Pizza mit Salami, Kse und
Tomatenpampe 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];
}
44
2.4
Neue Konzepte
}
$factoryClosure = function() {
$pizzaSalami = new Pizza(new
$pizzaSalami->addTopping(new
$pizzaSalami->addTopping(new
$pizzaSalami->addTopping(new
return $pizzaSalami;
};
CrustWheatFlour());
ToppingSalami());
ToppingCheese());
ToppingTomatoStodge());
Ein Service-Locator knnte neben Klassennamen und Closures auch andere Parameter fr die Instanziierung der Objekte verarbeiten, was die Flexbilitt und die Testbarkeit erhhen wrde. So wren Factory-Klassen denkbar, deren Aufgabe es ist, ein
Objekt einer Klasse zu instanziieren und zurckzuliefern.
In Abschnitt 6.1, Zend\ServiceManager, wird die Zend Framework 2-Implementation des Service-Locator-Entwurfsmusters und deren Konfiguration mit Beispielen
erlutert.
2.4.4
Ereignisgesteuerte Architektur
45
Listing 2.11 zeigt ein kompaktes Beispiel fr einen Event-Manager. Zuerst wird das
Interface EventListener definiert, das von einer Reihe von Klassen implementiert
wird. Die Klassen SendConfirmation, UpdateStock und BakePizza implementieren die
Methode postOrder(). Die Klasse CheckStock implementiert die Methode preOrder().
Zustzlich bentigen wir noch eine Klasse fr die Bestellung der Pizza. Den Kern stellt
die Klasse EventManager dar. Mithilfe der Methode attach() knnen die definierten
Listener fr ein entsprechendes Ereignis hinzugefgt werden. Zudem steht die
Methode trigger() bereit, um die Ereignisse bei den registrierten Listenern ausfhren 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";
}
46
2.4
Neue Konzepte
}
class EventManager
{
protected $listeners = array();
Danach wird der Event-Manager instanziiert, und die Listener werden fr die Ereignisse hinzugefgt. Entscheidend fr die Ausfhrung eines Listeners ist die Reihenfolge, in der die Listener hinzugefgt wurden. Danach kann es endlich losgehen.
Zuerst wird das Ereignis preOrder ausgelst, danach wird die Bestellung erstellt und
zum Schluss das Ereignis postOrder ausgelst. Die Ausgabe erfolgt in dieser Reihenfolge:
Check stock
Save order
Send order confirmation
Bake the pizza
Update stock
47
Natrlich ist dieser Event-Manager recht primitiv. Listener mssten auch entfernt
werden knnen. Zudem wre eine frei definierbare Reihenfolge fr die Ausfhrung
der Listener beim Auslsen eines Ereignisses sinnvoll. Wir knnten weitere Interfaces erstellen, die das Vorhandensein von preOrder()- und postOrder()-Methoden
vorschreiben. Auerdem sollte nach einer fehlerhaften Prfung des Bestandes durch
eine Exception der gesamte Prozess beendet werden, damit die Bestellung nicht
gespeichert wird.
In Kapitel 5, Der Event-Manager, wird die Zend Framework 2-Implementation des
Event-Managers ausfhrlich dargelegt und mit Beispielen versehen. brigens wurde
der Event-Manager mittlerweile auch in das Zend Framework 1.12 zurckportiert.
2.5
Komponentenvergleich
Der Groteil der Komponenten, die es bereits im Zend Framework 1 gegeben hat, findet sich auch weiterhin im Zend Framework 2 wieder. Manche Komponenten wurden nur leicht berarbeitet, andere wiederum von Grund auf neu entwickelt; wieder
andere 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 gegeben
hat. Zend_Auth ist in Zend\Authentication umbenannt worden, und aus Zend_Controller wurde Zend\Mvc. Die Komponente Zend_Acl wurde nach Zend\Permissions\
Acl verschoben. Wenn Sie bisher diese Komponenten reichlich genutzt haben, knnen Sie auch weiterhin darauf bauen, auch wenn sich die Benutzung dieser Komponenten zum Teil gravierend gendert hat.
Zend\Authentication
Zend\Http
Zend\Progressbar
Zend\Barcode
Zend\InputFilter
Zend\Serializer
Zend\Cache
Zend\Json
Zend\Server
Zend\Captcha
Zend\Ldap
Zend\Session
Zend\Console
Zend\Loader
Zend\Soap
Zend\Code
Zend\Log
Zend\Tag
Zend\Config
Zend\Mail
Zend\Text
Zend\Db
Zend\Memory
Zend\Uri
Zend\Debug
Zend\Mime
Zend\Validator
48
2.5
Komponentenvergleich
Zend\Dom
Zend\Mvc
Zend\Version
Zend\Feed
Zend\Navigation
Zend\View
Zend\Filter
Zend\Paginator
Zend\XmlRpc
Zend\Form
Zend\Permissions\Acl
In Tabelle 2.2 sind alle diejenigen Komponenten aufgelistet, die im Zend Framework 2
komplett neu hinzugekommen sind. Dabei stellt Zend\I18n eine Besonderheit dar. Im
Zend Framework 1 gab es mit Zend_Date, Zend_Locale, Zend_Translate und anderen
einen bunten Strau an Komponenten fr die Internationalisierung (i18n) und
Lokalisierung (l10n) von Webanwendungen. Da PHP 5.3 jedoch eigene Funktionalitten fr die Internationalisierung und Lokalisierung bietet, konnten diese Komponenten stark reduziert werden. Das Ergebnis ist die Komponente Zend\I18n, die
weiterhin einen Translator sowie Filter und Validatoren fr die Internationalisierung
und Lokalisierung bereitstellt.
Zend\Crypt
Zend\EventManager
Zend\ModuleManager
Zend\Di
Zend\I18n
Zend\ServiceManager
Zend\Escaper
Zend\Math
Zend\Stdlib
Tabelle 2.3 listet alle Komponenten auf, die es nicht mehr in den Kern des Zend
Framework geschafft haben. Alle mit einem (I18n) markierten Komponenten
wurden wie oben erwhnt in der neuen Komponente Zend\I18n zusammengefasst.
Fr die Komponenten mit einem (GH) wurden auf GitHub eigene Repositories
eingerichtet (https://github.com/zendframework). Die ZF-Community ist dazu aufgerufen, sich dieser Komponenten anzunehmen und sie zuknftig weiterzuentwickeln. Das Zend Framework-Kernteam kann diese Arbeit zuknftig nicht mehr bernehmen.
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_Test
Tabelle 2.3 Der traurige Rest: vergessen, verraten und verkauft (Stand: ZF 2.2.0)
49
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_Wildfire
Zend_InfoCard
Zend_Registry
Zend_Locale (I18n)
Zend_Rest (GH)
Tabelle 2.3 Der traurige Rest: vergessen, verraten und verkauft (Stand: ZF 2.2.0) (Forts.)
2.6
Wer vom Zend Framework 1 auf das Zend Framework 2 umsteigt, kommt in den
Genuss einiger wesentlicher Vorteile:
50
Ein wichtiges Feature des Zend Framework 2 ist die neue Modularitt, die den Austausch von Modulen zwischen Anwendungen sowie die Konfiguration der
Module stark vereinfacht. Zudem gibt es bereits ein groes Angebot an wiederverwendbaren Fremdmodulen, und nahezu tglich kommen mehr dazu. Diese fremden Module lassen sich in der Regel leicht installieren und bei Bedarf auch
anpassen.
2.6
Das Zend Framework 1 bot ein hohes Ma an Flexibilitt. Mit dem Zend Framework 2 konnten diese Freiheiten nochmals erweitert werden. Gab es im ZF1 festgelegte Konventionen, an die Sie sich halten mussten, damit Ihre Anwendung
problemlos lief, so knnen Sie im ZF2 viele Funktionalitten selber konfigurieren.
Es gibt zwar immer noch Empfehlungen, an die Sie sich halten sollten. Aber Sie
haben auch mehr Freiheiten.
Neu beim ZF2 ist auch die Mglichkeit, nur die Komponenten zu installieren, die
Sie brauchen. Sie sind nicht gezwungen, das gesamte Framework herunterzuladen. Fr die Installation stehen zudem mehrere Wege (u.a. Composer, Pyrus) zur
Auswahl.
Wie beim ZF1 sind Sie auch beim ZF2 nicht gezwungen, das gesamte Framework
fr Ihre Anwendung zu nutzen. Sie knnen das Zend Framework somit als Glue
Framework einsetzen. Auf der anderen Seite knnen Sie das Zend Framework auch
als Full-Stack Framework verwenden und damit komplette Projekte umsetzen.
Das gesamte Framework ist mit einer soliden Testbasis ausgestattet. Keine Komponente wird fr den Kern akzeptiert, wenn die Funktionalitten nicht mit ausreichend und fehlerfreien Unit-Tests ausgestattet sind.
Wer sich beim ZF1 einbringen wollte, um neue Features beizusteuern, Bugs zu
fixen oder die Dokumentation zu bersetzen, musste zwingend ein CLA (Contributor License Agreement) unterzeichnen und an die Firma Zend faxen. Diese
Hrde fllt mit dem Zend Framework 2 weg.
Es gibt auch einige Nachteile beim Einsatz des Zend Frameworks 2, die gerade zu
Beginn und bei der Einarbeitung eine groe Hrde darstellen. Diese sollen nicht verschwiegen werden, auch wenn sie mit wachsender Erfahrung keine Hindernisse
mehr darstellen werden.
51
lieren, kennenlernen werden, nimmt Ihnen zwar einiges an Arbeit ab. Dennoch
mssen Sie fr Ihre Anwendungsmodule die Routen, die Controller, eigene View
Helper und Plugins, das Autoloading und vieles mehr konfigurieren.
Die zustzliche Flexibilitt, die das Zend Framework 2 bietet, hat natrlich auch
eine hhere Komplexitt zu Folge. Wer seit einigen Jahren mit dem Zend Framework 1 gearbeitet hat, der kann damit neue Projekte im Schlaf einrichten. Mit dem
Zend Framework 2 wird dies gerade zu Anfang vielleicht nicht so schnell von der
Hand gehen.
Die neuen Konzepte erfordern neues Denken der Entwickler. Wenn Sie sich mit
Themen wie Dependency Injection oder der ereignisgesteuerten Architektur auskennen, ist das ein groes Plus fr den Einstieg ins ZF2.
Auer mit dem Zend Framework 2 an sich muss der Entwickler sich auch noch mit
Tools wie Git, Pyrus und Composer auseinandersetzen.
52
Kapitel 13
Benutzermanagement
Eine moderne Webanwendung lebt von der Interaktion ihrer Nutzer. Doch selbst
eine Website, die nicht mit dem Besucher interagieren mchte, muss von Redakteuren gepflegt werden. Fr das Benutzermanagement stellt das ZF2 mehrere Komponenten bereit. Dazu zhlen die Sessionverarbeitung, die Autorisierung und die
Authentifizierung.
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
13
Zend\Session
Zend\Session setzt auf dem PHP-internen Sessionhandling auf und stellt Container
als einfachen Weg zum Speichern von Daten in Sessions bereit. Dazu gibt es Funktionen fr die Sessionverarbeitung und die Mglichkeit, Sessions in einer Datenbank zu
schreiben (siehe https://zf2.readthedocs.org/en/latest/modules/zend.session.introduction.html).
13.1.1
Um mit einem Container zu arbeiten, erstellen Sie eine Zend\Session\ContainerInstanz und bergeben die zu speichernden Daten. Beim nchsten Seitenaufruf knnen Sie darauf zugreifen (siehe Listing 13.1). Bei der Instanziierung eines ContainerObjekts bergeben Sie einen Bezeichner, um die gespeicherten Daten identifizieren
zu knnen. Dem Objekt knnen Sie Daten zuweisen, indem Sie einen Bezeichner mit
Werten belegen. Im ersten Beispiel wird bei jedem Seitenaufruf ein Zhler um 1
erhht.
use Zend\Debug\Debug;
use Zend\Math\Rand;
use Zend\Session\Container;
$counter = new Container('counter');
$counter->number = $counter->number + 1;
351
13
Benutzermanagement
Im zweiten Beispiel werden eine Pizza und ein Container-Objekt erstellt. Mit offsetExists() 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 den
Bezeichner mit einem Wert belegen. Die Werte fr die beiden Bezeichner werden ausgegeben; 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 verwenden
Mit dem Session-Manager knnen Sie die Konfiguration ndern, Sessions starten
und beenden, die Cookie-Lebenszeit ndern, die Session-ID erneuern usw. Das Container-Objekt ermglicht mit getManager() den Zugriff auf den Session-Manager:
use Zend\Session\Container;
$container = new Container('pizza');
$sessionManager = $container->getManager();
352
13.1
Zend\Session
ber den Session-Manager haben Sie Zugriff auf die Session-Konfiguration und knnen diese bei Bedarf anpassen:
$sessionManager->getConfig()->setSavePath(
LUIGI_ROOT . '/data/session'
);
$sessionManager->getConfig->setName('luigi_session');
$sessionManager->getConfig->setCookieLifetime(3600);
Wenn noch keine Session gestartet wurde, knnen Sie dies manuell machen. Sie knnen die Session wieder lschen, wobei Session-Daten und Session-Cookie auch
gelscht werden:
$sessionManager->start();
[...]
$sessionManager->destroy();
Auerdem knnen Sie eine Session-ID erstellen oder die Cookie-Laufzeit auf 0
setzen:
$sessionManager->regenerateId();
$sessionManager->rememberMe(3600);
$sessionManager->forgetMe();
13.1.3
353
13
13
Benutzermanagement
modified integer,
lifetime integer
);
Listing 13.2 SQL-Dump fr Datenbanktabelle sessions fr SQLite3
Zend\Db\Adapter\Adapter;
Zend\Db\TableGateway\TableGateway;
Zend\Debug\Debug;
Zend\Session\SessionManager;
Zend\Session\SaveHandler\DbTableGateway;
Zend\Session\SaveHandler\DbTableGatewayOptions;
Als Nchstes wird dem Session-Manager der neue SaveHandler mitgeteilt. Danach
wird die Session gestartet. Der Aufruf der Methode writeClose() ist normalerweise
nicht notwendig, da sie am Ende der Verarbeitung einer Anfrage automatisch aufge-
354
13.2
Zend\Permissions\Acl
rufen wird. Hier dient der Aufruf nur zu Demonstrationszwecken, damit bei der
Abfrage der Daten ber das TableGateway auch beim ersten Seitenaufruf etwas ausgegeben wird. Die Session-Daten werden in der Datenbank abgelegt und knnen weiterverwendet werden. So knnte eine Verknpfung zu einem bestimmten Benutzer
abgelegt werden oder es knnte abgefragt werden, welche Sessions sich in den letzten 5 Minuten verndert haben, um die Anzahl der aktiven Nutzer zu schtzen.
13.2
Zend\Permissions\Acl
Bei der Autorisierung legen Sie fest, welche Funktionen ein Benutzer in der Anwendung ausfhren darf. Dafr stellt Zend\Permissions\Acl eine Zugriffskontrollliste
(access control list, kurz ACL) bereit. Sie legt fest, wer auf die vorhandenen Ressourcen welche Rechte anwenden darf oder nicht. Details finden Sie im Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-permissions-acl.
13.2.1
Begrifflichkeiten
13
Eine ACL besteht aus mehreren Bestandteilen. Das erste Element sind die Benutzerrollen. Beispiele hierfr sind Gste, Kunden, Redakteure oder Administratoren. Die
Rollen knnen mit Zend\Permissions\Acl verschachtelt werden, sodass ein Administrator z. B. alle Rechte der Gste, Kunden und Redakteure erben kann.
Das zweite Element sind die Ressourcen. Dabei handelt es sich um die Objekte, auf
die Rechte ausgebt werden sollen. Dies knnen z. B. Produkte wie eine Pizza, Artikel
aus dem CMS oder ein Profilbild sein. Oft werden auch die Action-Controller als Ressourcen verwendet. Auch Ressourcen knnen voneinander erben.
Das dritte Element sind die Privilegien. Dabei geht es darum, welche Aufgabe mit
einer Ressource ausgefhrt werden soll. Ein Produkt kann bestellt oder verndert
werden, ein Artikel kann erstellt oder gelscht werden, und ein Profilbild kann verkleinert oder ausgedruckt werden. Oft werden die Aktionsmethoden aus den ActionControllern als Privilegien verwendet.
Als viertes Element dienen Regeln. Diese besagen, dass eine Rolle auf eine Ressource
ein Privileg anwenden darf oder nicht. Kunden drfen Produkte bestellen, Redakteure drfen Artikel erstellen und Administratoren drfen Profilbilder verkleinern.
13.2.2
ACL definieren
In Listing 13.4 wird eine ACL fr einen Pizza-Service definiert. Die Rollen guest, customer, staff und admin werden definiert, wobei customer von guest und staff von
355
13
Benutzermanagement
customer erben soll. Die beiden Ressourcen product und order werden definiert. Zum
Schluss 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 definieren
Kunden drfen Produkte in den Warenkorb legen und alles tun, was Gste drfen.
Mitarbeiter drfen Produkte anlegen und bearbeiten und alles tun, was Kunden
und Gste drfen.
brigens ist der Aufruf von deny() berflssig, da alle Rollen fr alle Ressourcen erst
einmal nichts drfen. Zudem knnen Sie auch globale Rechte vergeben und sperren,
indem Sie keine Privilegien (und Ressourcen) beim Aufruf von allow() und deny()
angeben.
356
13.2
13.2.3
Zend\Permissions\Acl
ACL abfragen
Eine ACL wird mit isAllowed() abgefragt, wobei die Rolle, die Ressource und das Privileg oder Teile davon angegeben werden. Listing 13.5 zeigt die Abfrage der ACL von
oben. Es wird true oder false zurckgegeben, abhngig von den vorhandenen Rechten 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'));
13
Es ist denkbar, bei einer Abfrage kein Privileg abzugeben, wenn Sie prfen wollen, ob
eine Rolle mit einer Ressource berhaupt etwas machen darf.
13.2.4
ACL cachen
Da der Aufbau einer ACL recht komplex sein kann, sollten Sie fertige Acl-Objekte mit
Zend\Cache cachen (siehe Listing 13.6). Nach der Konfiguration des Cache-Storage
wird geprft, ob sich die ACL im Cache befindet. Falls nein, wird sie erstellt und
gecacht. 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(
357
13
Benutzermanagement
13.3
Zend\Permissions\Rbac
Eine Alternative zur ACL ist Zend\Permissions\Rbac, mit der Sie eine rollenbasierte
Zugriffskontrolle (role-based access control RBAC) umsetzen knnen. Im Gegensatz
zur ACL liegt der Fokus auf den Rollen und nicht auf den Ressourcen. Die Details finden Sie im Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.
html#zend-permissions-rbac.
13.3.1
Begrifflichkeiten
Die 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 annehmen. Whrend Alessandro der einzige Administrator ist, sind Luigi, Alessandro und
Francesca alle Mitarbeiter. Rollen knnen auch unterteilt sein.
358
13.3
Zend\Permissions\Rbac
Das dritte Element sind die Berechtigungen. Eine Berechtigung kann verschiedenen
Rollen zugeordnet sein, whrend eine Rolle verschiedene Berechtigungen haben
kann. Whrend ein Administrator Bestellungen lschen kann, kann ein Mitarbeiter
sie nur verndern.
13.3.2
RBAC definieren
Bitte beachten Sie, dass Sie nicht wie bei der ACL globale Rechte vergeben knnen. Es
ist nicht mglich, einem Administrator alle Berechtigungen in einem Rutsch zu
geben. Sie mssen fr jede Rolle alle Genehmigungen definieren oder mit Hierarchien arbeiten.
Um die RBAC zu definieren, mssen Sie Rollen, Berechtigungen und Beziehungen zu
anderen Rollen festlegen. Danach knnen Sie das Role-Objekt einem Rbac-Objekt
zuordnen. In Listing 13.7 werden vier Rollen und deren Berechtigungen definiert. Soll
ein Role-Objekt die Berechtigungen eines anderen erben, knnen Sie mit addChild()
die untergeordnete Rolle angeben, von der die Rechte geerbt werden sollen. Es kann
beliebig viele untergeordnete Rollen geben. Mit addRole() ordnen Sie eine Rolle
einem 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');
359
13
13
Benutzermanagement
$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 definieren
Die Berechtigungen bestehen aus einem Prfix (wie 'pizza' oder 'order'), einem
Unterstrich und dem eigentlichen Namen (wie 'list', 'basket' oder 'cancel'). Sie knnen diesen Vorschlag bernehmen, die Reihenfolge ndern, einen Punkt als Trenner
verwenden oder mit Zahlen arbeiten. Zudem knnen Sie auch den Namen eines Controllers und einer Aktionsmethode verwenden. Wichtig ist nur dass jede Berechtigung eindeutig ist.
Das erstellte Rbac-Objekt lsst sich cachen. Die Vorgehensweise fr das Cachen eines
Acl-Objekts finden Sie in Listing 13.6.
13.3.3
RBAC abfragen
Fr die Abfrage der RBAC mssen Sie den Namen der Rolle sowie den Namen der
Berechtigung an die Methode isGranted() bergeben. Sie erhalten als Ergebnis true
oder 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 fehlerhaften Prfungen sind die abgefragten Berechtigungen fr die Rolle nicht vorhanden. Bei der letzten Abfrage auf 'order_copy' ist diese Berechtigung in der RBAC gar
nicht 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'));
360
13.4
Zend\Authentication
Debug::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 abfragen
13.4
Zend\Authentication
Die Komponente bringt mehrere Adapter mit sich, die fr die Authentifizierung
zustndig sind. Auerdem stehen Storages zum Speichern des authentifizierten
Benutzers sowie ein Authentifizierungsservice bereit. Weitere Details finden Sie im
Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zendauthentication.
Ein Beispiel fr einen Authentifizierungsadapter, der fr die Passwortverschlsselung die Komponente Zend\Crypt\Password\Bcrypt einsetzt, finden Sie in Abschnitt
17.3.1, Authentifizierungsadapter.
13.4.1
Bei der Authentifizierung mit HTTP mssen Sie die Varianten Basic Authentication
und Digest Authentication unterscheiden. Der Unterschied ist, dass die Passwrter
bei 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 die
Passwrter unverschlsselt sind.
luigi:Luigis Pizza-Service:luigi
francesca:Luigis Pizza-Service:francesca
alessandro:Luigis Pizza-Service:alessandro
valentina:Luigis Pizza-Service:valentina
Listing 13.9 Die Passwortdatei basic.pw fr eine Basic-HTTP-Authentication
Das Beispiel luft in Listing 13.10 im Kontext eines View-Scripts, wundern Sie sich
also nicht ber den Zugriff auf den Service-Manager ber den HelperPluginManager.
Aus dem Service-Manager werden die Request- und Response-Objekte geholt. Der
Http-Adapter wird mit der Methode Basic Authentication und dem Realm Luigis
Pizza-Service konfiguriert. Der FileResolver wird fr die Passwortdatei konfiguriert
und Resolver, Request und Response werden an den Adapter bergeben. Durch den
361
13
13
Benutzermanagement
362
13.4
Zend\Authentication
nur ist das Passwort mit md5() verschlsselt und der Hash wird z. B. aus der Kombination luigi:Luigis Pizza-Service:luigi gebildet.
luigi:Luigis Pizza-Service:6b150f7dc4cdc0fe1b16315482544685
francesca:Luigis Pizza-Service:d23e77cb95c9129102cd8452a9e10390
alessandro:Luigis Pizza-Service:b03fd2ec130d394f1af3960e3bb37017
valentina:Luigis Pizza-Service:8792865b2896655c5de293ef425a06c3
Listing 13.11 Die Passwortdatei digest.pw fr eine Digest-HTTP-Authentication
Der Ablauf der Digest Authentication ist in Listing 13.12 (gekrzt) zu sehen und unterscheidet 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 mit
http://luigis-pizza.local/listing/listing1312 aus.
[...]
$adapter = new Http(array(
'accept_schemes' => 'digest',
'realm'
=> 'Luigis Pizza-Service',
'digest_domains' => '/listing/listing1312',
'nonce_timeout' => 3600,
));
13
13.4.2
363
13
Benutzermanagement
pass varchar(32)
);
INSERT INTO "users"
VALUES (1,'luigi','ccebba93f54d6bf2b17f8350e7c12ec4');
Listing 13.13 SQL-Dump fr die Datenbanktabelle users fr SQLite3
Zur Authentifizierung gegen eine Datenbanktabelle kommt der DbTable zum Einsatz.
In Listing 13.14 werden Zugangsdaten notiert und wird der Authentifizierungsadapter mit dem Datenbankadapter und den Namen fr die Tabelle, Benutzerspalte und
Passwortspalte konfiguriert.
use Zend\Authentication\Adapter\DbTable;
use Zend\Db\Adapter\Adapter;
use Zend\Debug\Debug;
$credentials =
array('name'
array('name'
array('name'
);
array(
=> 'francesca', 'pass' => 'francesca'),
=> 'luigi',
'pass' => 'francesca'),
=> '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()) {
364
13.4
Zend\Authentication
Debug::dump($authAdapter->getResultRowObject(null, 'pass'));
}
}
Listing 13.14 Authentifizierung mit dem DbTable-Adapter
Fr jede Zeile werden im Authentifizierungsadapter der Benutzername und das Passwort festgelegt und wird die Authentifizierung gestartet. War der Versuch erfolglos,
wird das Result-Objekt ausgegeben. Dem Result-Objekt knnen Sie die genaue Fehlermeldung entnehmen. War die Authentifizierung erfolgreich, wird zustzlich der
gefundene Datensatz mit getResultRowObject() ausgegeben. Durch die Angabe von
'pass' als zweiten Parameter wird der Inhalt der Passwortspalte nicht zurckgegeben.
13.4.3
Authentifizierungsservice
Sie knnen Ihre Benutzerauthentifizierung direkt mit einem der bisher vorgestellten
Adapter durchfhren. Der Zend\Authentication\AuthenticationService erleichtert
die Authentifizierung jedoch noch weiter. Um den Ablauf an einem praktischen Beispiel zu demonstrieren, bentigen Sie ein Formular zum Anmelden und Abmelden
(siehe Listing 13.15). Weitere Details zu Zend\Form finden Sie in Kapitel 12, Formularverarbeitung.
namespace Pizza\Form;
use
use
use
use
Zend\Form\Element\Password;
Zend\Form\Element\Submit;
Zend\Form\Element\Text;
Zend\Form\Form;
365
13
13
Benutzermanagement
$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\Authentication
366
Pizza\Form\LoginForm;
Pizza\Form\LogoutForm;
Zend\Authentication\AuthenticationService;
Zend\Authentication\Adapter\DbTable;
Zend\Db\Adapter\Adapter;
Zend\Http\PhpEnvironment\Request;
13.4
Zend\Authentication
13
$result = $authService->authenticate($authAdapter);
if (!$result->isValid()) {
$showMessage = implode('<br />', $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 '<div class="alert ' . $alertClass . '">'
. $showMessage . '</div>';
}
$form = $authService->hasIdentity()
367
13
Benutzermanagement
? 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 einsetzen
13.5
Zend\Ldap
Die Zend\Ldap-Komponente ermglicht die Kommunikation zwischen Ihrer Anwendung und einem LDAP-Verzeichnis. Sie knnen Zend\Ldap eigenstndig und als
Adapter mit Zend\Auth einsetzen. Weitere Details zu Zend\Ldap finden Sie im Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-ldap.
368
Index
Index
A
AggregateResolver ................................................. 244
Akismet ....................................................................... 526
Anwendungsmodul ............................................... 383
Controller................................................................ 173
Konfiguration .............................................. 171, 384
Men....................................................................... 399
Modul-Klasse........................................................ 170
Request-Parameter ............................................. 175
Seitenlayout.......................................................... 395
View-Script ............................................................. 173
Apache 2........................................................................ 57
Konfiguration ........................................................ 57
Virtual Host Linux................................................ 57
Virtual Host Windows ........................................ 59
Aspektorientierte Programmierung ................ 117
AssetManager ............................................................ 155
Atom-Feeds............................................................... 309
B
B8-Filter ....................................................................... 526
Barcodes...................................................................... 314
Basket Controller-Plugin..................................... 580
Bcrypt ........................................................................... 376
Benutzermanagement ........................................... 351
Authentifizierungsservice ............................... 365
Session-Manager ................................................ 352
Zend\Authentication ........................................ 361
Zend\Ldap ............................................................ 368
Zend\Permissions\Acl....................................... 355
Zend\Permissions\Rbac................................... 358
Zend\Session ......................................................... 351
Benutzer-Modul....................................................... 453
Anforderungen .................................................... 453
Authentifizierungsadapter............................ 456
Authentifizierungsservice .............................. 460
Autorisierungsservice ....................................... 461
Benutzerrechte.................................................... 464
ffentlicher Bereich ........................................... 478
UserListener .......................................................... 475
User-Service ......................................................... 466
View-Helper ......................................................... 470
Vorbereitungen ................................................... 454
Blog-Modul ................................................................. 411
Administrationsbereich .................................. 444
Blog-Modul (Forts.)
Anforderungen..................................................... 411
Blog-Service ........................................................... 431
Einrichtung ............................................................ 412
Entitt ...................................................................... 421
Filter......................................................................... 426
Formular ................................................................ 428
Formular-Factories............................................ 429
Modelinfrastruktur............................................ 419
ffentlicher Bereich.......................................... 440
Routing.................................................................... 415
Screenshot................................................... 443, 450
TableGateway...................................................... 423
C
CKEditor............................................................ 409, 448
Inline Editing........................................................ 549
Closures ........................................................................ 36
CmsContentBlock-View-Helper................ 553, 558
CMS-Modul................................................................ 549
Anforderungen.................................................... 549
CMS-Service .......................................................... 556
CMS-Service erweitern...................................... 556
Controller .............................................................. 562
Formular ................................................................. 555
Funktionsweise ................................................... 563
JavaScript-Funktionen .................................... 560
Textblcke .............................................................. 553
View-Helper .................................................. 553, 558
Vorbereitungen ................................................... 550
CommentShowComments-View-Helper....... 513
CommentShowLinks-View-Helper.................... 511
Composer..................................................................... 65
Autoloading ........................................................... 83
Fremdmodul installieren ................................. 179
SkeletonApplication installieren ................... 70
Zend Framework 2 installieren ....................... 65
ConsoleRenderer..................................................... 245
Controller.................................................................... 211
Action-Controller ................................................ 212
Einfhrung ............................................................. 211
Objekt-Zugriff ....................................................... 214
RESTful-Controller .............................................. 218
Services injizieren................................................ 215
Controller-Plugin
Basket..................................................................... 580
611
Index
Controller-Plugin (Forts.)
Eigenes Plugin erstellen ................................... 234
FilePostRedirectGet.................................. 231, 500
FlashMessenger................................................... 233
Forward .................................................................. 227
Layout ..................................................................... 225
Params.................................................................... 229
PostRedirectGet................................................... 229
Redirect................................................................... 227
SpamCheck............................................................ 532
Url ............................................................................. 225
Zugriff...................................................................... 224
CurrencyFormat-View-Helper .................. 293, 397
Cycle-View-Helper .................................................. 252
D
DateFormat-View-Helper..................................... 293
Datei-Uploads .......................................................... 498
Datenbank.................................................................. 257
Datenbankadapter ............................................ 258
Datenbankmodell .............................................. 257
Datenbankzugriffe loggen.............................. 275
DDL.......................................................................... 270
Doctrine 2 .............................................................. 281
Microsoft SQL Server ......................................... 258
MySQL ............................................................ 257, 303
Paginierung ......................................................... 304
PostgreSQL ................................................... 257, 303
RowGateway ........................................................ 278
SQL-Abfragen ....................................................... 265
SQLite3 ........................................................... 257, 303
TableGateway ....................................................... 271
Zend\Db.................................................................. 257
Date-View-Helper.................................................... 393
DDL............................................................................... 270
Dependency Injection ..................................... 41, 127
Zend\Di .................................................................... 141
DluTwBootstrap....................................................... 337
Doctrine 2................................................................... 281
Annotationen....................................................... 283
DoctrineORMModule........................................ 281
Dokumentation................................................... 287
Entitten ................................................................ 283
Entity-Manager .................................................. 286
Installation............................................................ 281
Modul konfigurieren ......................................... 282
Relationen ............................................................. 285
Reverse Engineering ......................................... 286
Doctrine/Common................................................. 343
DoctrineORMModule ............................................ 281
612
E
Entwurfsmuster
Beobachter............................................................. 117
Dependency Injection........................................ 127
Ereignisgesteuerte Architektur ...................... 117
MVC .......................................................................... 183
Service-Locator..................................................... 127
Ereignisgesteuerte Architektur.................... 45, 117
Event-Manager .................................................... 117
EscapeCss-View-Helper ......................................... 251
EscapeHtmlAttr-View-Helper ............................. 251
EscapeHtml-View-Helper ..................................... 251
EscapeJs-View-Helper............................................. 251
EscapeUrl-View-Helper.......................................... 251
Escaping............................................................ 248, 250
Zend\Escaper ........................................................ 312
Event-driven architecture ..................................... 45
EventFeature.............................................................. 275
ext/intl .......................................................................... 56
F
FeedRenderer............................................................ 245
FeedStrategy ...................................................... 245, 311
FilePostRedirectGet Plugin ........................ 231, 500
FlashMessenger-Plugin ........................................ 233
FormElementErrors-View-Helper .................... 335
FormElement-View-Helper................................. 335
FormLabel-View-Helper ....................................... 335
FormRow-View-Helper ......................................... 334
Formularverarbeitung........................................... 315
Ausgabe mit View-Helpern ............................ 333
Fieldset als Collection ....................................... 329
Formularelemente .............................................. 331
Objekte anbinden.............................................. 340
Validierung ........................................................... 337
Zend\Form ............................................................ 322
Zend\InputFilter .................................................. 315
Form-View-Helper.................................................. 334
Fortschrittsbalken ................................................. 606
Fremdmodule............................................................ 179
AssetManager....................................................... 155
DluTwBootstrap ................................................. 337
Doctrine/common ............................................. 343
doctrine/common.............................................. 343
DoctrineORMModule ........................................ 281
SmartyModule..................................................... 256
ZfcBase..................................................................... 181
ZfcTwitterBootstrap.......................................... 337
Index
Fremdmodule (Forts.)
ZfcUser ..................................................................... 181
ZFTool....................................................................... 69
G
GetOrder-View-Helper ......................................... 586
Git & GitHub ............................................................... 39
Einfhrung .............................................................. 39
Fremdmodul klonen ........................................... 181
SkeletonApplication installieren................... 69
GlobalAdapterFeature ........................................... 275
Gravatar-View-Helper ........................................... 252
H
HeadTitle-View-Helper ........................................ 388
HtmlFlash-View-Helper........................................ 252
HtmlList-View-Helper ........................................... 252
HtmlObject-View-Helper ..................................... 252
HtmlPage-View-Helper......................................... 252
HTMLPurifier ........................................................... 406
HtmlQuicktime-View-Helper............................. 252
Hydrator............................................. 263, 341, 377, 571
HydratorInterface .............................................. 341
ReflectionHydrator ........................................... 264
JSON (Forts.)
JsonStrategy ......................................................... 245
Zend\Json................................................................ 312
Json ................................................................................ 312
JsonRenderer ............................................................ 245
JsonStrategy .............................................................. 245
Json-View-Helper .................................................... 252
K
Kommentar-Modul................................................ 505
Administrationsbereich................................... 507
Anforderungen.................................................... 505
Kommentare anlegen ....................................... 519
Kommentar-Service ........................................... 521
Konfiguration ..................................................... 508
Modelinfrastruktur........................................... 506
Spamabwehr ......................................................... 535
View-Helper ............................................................ 511
View-Helper einsetzen....................................... 516
Vorbereitungen .................................................. 506
Konzepte ...................................................................... 40
Dependency Injection.......................................... 41
Ereignisgesteuerte Architektur ....................... 45
Event-driven architecture ................................. 45
Modularitt ............................................................ 40
Service-Locator...................................................... 43
I
include_path ............................................................... 61
InlineScript-View-Helper ..................................... 252
Installation SkeletonApplication........................ 68
Composer................................................................. 70
Git .............................................................................. 69
ZIP-Paket ................................................................. 69
Installation Zend Framework............................... 61
Composer................................................................. 65
include_path .......................................................... 61
Pyrus .......................................................................... 62
ZIP-Paket .................................................................. 61
Internationalisierung
ext/intl ...................................................................... 56
Sprache mittels Routing ................................. 205
Zend\I18n .............................................................. 289
J
JSON
Controller............................................................... 247
JsonModel .............................................................. 243
JsonRenderer ........................................................ 245
L
Late Static Binding.................................................... 38
Layout
Listener ................................................................... 395
Layout-Plugin ........................................................... 225
Layout-View-Helper............................................... 252
Library-Modul ........................................................... 177
Listings ........................................................................... 31
M
MasterSlaveFeature ................................................ 275
MetadataFeature ...................................................... 275
Microsoft SQL Server............................................. 258
Modelinfrastruktur
Blog-Modul ........................................................... 419
Model-View-Controller.......................................... 183
Modularitt ................................................................. 40
Anwendungsmodul........................................... 169
Fremdmodule ....................................................... 179
Library-Modul ...................................................... 177
Module.php.............................................................. 77
613
Index
Modularitt (Forts.)
Modul-Manager ................................................... 151
Verzeichnisstruktur ............................................. 77
Module
Anwendungsmodul ........................................... 383
Benutzer-Modul .................................................. 453
Blog-Modul ............................................................ 411
CMS-Modul .......................................................... 549
Kommentar-Modul........................................... 505
Pizza-Modul......................................................... 483
Shop-Modul .......................................................... 565
Spamabwehr-Modul.......................................... 525
Mvc Events................................................................ 205
dispatch.error...................................................... 206
finish-Event .......................................................... 209
route-Event........................................................... 205
MySQL........................................................ 257, 259, 303
N
Navigation-View-Helper............................. 299, 302
NumberFormat-View-Helper ............................. 293
P
PageTitle-View-Helper ......................................... 388
PaginationControl-View-Helper ...................... 305
PartialLoop-View-Helper...................................... 252
Partial-View-Helper ................................................ 252
Passwrter verschlsseln..................................... 376
PHP 5.3........................................................................... 34
Buchtipps ................................................................ 60
Closures .................................................................... 36
Late Static Binding............................................... 38
PHP-Namespaces ................................................. 34
PHP-Extensions ......................................................... 54
PHP-Frameworks....................................................... 27
PhpRenderer ............................................................. 245
PhpRendererStrategy ............................................ 245
PHP-Version ................................................................ 53
Pizza-Modul.............................................................. 483
Administrationsbereich ................................... 501
Anforderungen ................................................... 483
Bild-Upload .......................................................... 498
Entitt .................................................................... 489
Modelinfrastruktur............................................ 485
Pizza-Karussell ................................................... 502
Pizza-Service........................................................ 490
TableGateway ..................................................... 486
Vorbereitungen .................................................. 484
Placeholder-View-Helper ..................................... 252
614
R
RenderChildModel-View-Helper ...................... 252
Renderer ..................................................................... 245
ConsoleRenderer................................................. 245
FeedRenderer ....................................................... 245
JsonRenderer ........................................................ 245
PhpRenderer......................................................... 245
RenderToPlaceholder-View-Helper................. 252
Resolver ...................................................................... 244
AggregateResolver............................................. 244
TemplateMapResolver ..................................... 244
TemplatePathStack ........................................... 244
RESTful-Webservice ................................................ 218
Controller .............................................................. 219
Konfiguration ....................................................... 221
Model-Service ...................................................... 220
Testen mit Zend\Http\Client ......................... 223
Routing........................................................................ 192
Beispiel..................................................................... 415
Konfiguration ...................................................... 201
Route-Typ ............................ 193, 194, 195, 196, 199
Route-Typen ......................................................... 192
SimpleRouteStack ............................................... 197
Tipps ........................................................................ 203
TreeRouteStack ................................................... 198
Zend\Navigation ................................................ 296
RowGatewayFeature..................................... 275, 280
RSS-Feeds................................................................... 309
S
ServerUrl-View-Helper ......................................... 223
Service-Locator .................................................. 43, 127
Zend\ServiceManager ....................................... 127
Shop Modul
Administrationsbereich................................... 596
Einsatz in Modulen............................................ 593
Funktionsweise ................................................... 594
Shop-Modul............................................................... 565
Anforderungen.................................................... 565
Bestellservice......................................................... 573
Controller-Plugin............................................... 580
Hydrator ................................................................. 571
Modelinfrastruktur............................................ 567
Positionen ............................................................. 569
Script ....................................................................... 589
Index
Shop-Modul (Forts.)
Serialisierung ........................................................ 571
View-Helper .......................................................... 581
View-Script ........................................................... 589
Vorbereitungen .................................................. 566
Warenkorb............................................................. 567
Warenkorb-Controller ...................................... 587
Warenkorb-Service............................................. 576
ShowBasket-View-Helper..................................... 581
ShowForm-View-Helper ....................................... 391
ShowMessages-View-Helper.............................. 389
SimpleRouteStack ................................................... 197
SkeletonApplication................................................. 68
Autoloading mit Composer.............................. 83
Hauptverzeichnis .................................................. 71
Installation aus ZIP-Paket ............................... 69
Installation mit Composer ............................... 70
Installation mit Git ............................................. 69
Konfiguration ........................................................ 82
Konfigurationsverzeichnis ............................... 73
Modulverzeichnis ................................................. 77
Public-Verzeichnis ................................................ 74
Vendor-Verzeichnis.............................................. 76
SOAP .............................................................................. 371
Spamabwehr-Modul .............................................. 525
Anforderungen .................................................... 525
Autoloading.......................................................... 529
B8-Filter .................................................................. 526
Controller-Plugin ................................................ 532
Kommentar-Modul anpassen ....................... 535
Konfiguration ...................................................... 527
Modelinfrastruktur............................................ 527
Modul einsetzen.................................................. 545
Serviceklasse........................................................ 530
View-Helper .......................................................... 534
Vorbereitungen ................................................... 526
SpamCheck-Controller-Plugin........................... 532
SpamCheck-View-Helper ..................................... 534
Spamfilter................................................................... 526
SQL-Abfragen ............................................................ 265
Delete...................................................................... 268
Insert....................................................................... 268
Join........................................................................... 266
Select........................................................................ 265
Update ................................................................... 268
SQLite3....................................................... 257, 259, 303
Strategies .................................................................... 245
FeedStrategy................................................. 245, 311
JsonStrategy.......................................................... 245
PhpRendererStrategy........................................ 245
T
Tagwolke...................................................................... 313
Template-Engines................................................... 256
TemplateMapResolver.......................................... 244
TemplatePathStack ................................................ 244
Translate-View-Helper.......................................... 292
Translator................................................................... 289
Konfiguration ...................................................... 291
Translator-Service.............................................. 292
View-Helper .......................................................... 292
Zend\Validator-Fehlermeldungen .............. 294
TreeRouteStack ........................................................ 198
Twitter Bootstrap..................................... 70, 337, 391
Alerts ....................................................................... 389
Carousel ................................................................. 502
Menleiste............................................................ 400
U
Url-Plugin................................................................... 225
Url-View-Helper........................................................ 174
UserIsAllowed-View-Helper .............................. 470
UserShowWidget-View-Helper........................... 471
V
View-Helper............................................................... 248
BasePath ................................................................ 249
CmsContentBlock....................................... 553, 558
CommentShowComments .............................. 513
CommentShowLinks ........................................... 511
CurrencyFormat ................................................. 397
Cycle ........................................................................ 252
Date ......................................................................... 393
Doctype .................................................................. 249
eigene View-Helper................................... 253, 388
EscapeCss................................................................ 251
EscapeHtml.................................................... 176, 251
EscapeHtmlAttr ................................................... 251
EscapeJs................................................................... 251
EscapeUrl................................................................ 251
Form ........................................................................ 334
FormElement........................................................ 335
FormRow ............................................................... 334
GetOrder ................................................................ 586
Gravatar ................................................................ 252
HeadLink ............................................................... 249
615
Index
View-Helper (Forts.)
HeadMeta............................................................. 249
HeadScript............................................................ 249
HeadStyle.............................................................. 249
HeadTitle............................................................... 249
HtmlFlash .............................................................. 252
HtmlList.................................................................. 252
HtmlObject............................................................ 252
HtmlPage............................................................... 252
HtmlQuicktime.................................................... 252
InlineScript ............................................................ 252
Json ........................................................................... 252
Layout ..................................................................... 252
Navigation .................................................. 299, 302
PageTitle ............................................................... 388
PaginationControl ............................................ 305
Partial...................................................................... 252
PartialLoop ........................................................... 252
Placeholder ........................................................... 252
RenderChildModel.............................................. 252
RenderToPlaceholder........................................ 252
ServerUrl........................................................ 223, 250
ShowBasket........................................................... 581
ShowForm.............................................................. 391
ShowMessages.................................................... 389
SpamCheck............................................................ 534
Translate ................................................................ 292
Url .................................................................... 174, 250
UserIsAllowed ..................................................... 470
UserShowWidget................................................. 471
ViewModel............................................................. 252
Widgets ................................................................... 253
ViewModel ................................................................. 241
Aktionsmethode.................................................. 241
ConsoleModel ...................................................... 243
FeedModel ..................................................... 243, 311
JsonModel .............................................................. 243
Listener ................................................................... 395
Verschachtelung ................................................. 242
ViewModel-View-Helper ...................................... 252
View-Scripts............................................................... 247
Beispiel ........................................................... 174, 248
Escaping ....................................................... 248, 250
Templatevariablen............................................ 248
View-Helper ......................................................... 248
Virtual Host Linux .................................................... 57
Virtual Host Windows ............................................. 59
Voraussetzungen ...................................................... 53
Apache 2-Konfiguration .................................... 57
PHP-Extensions ..................................................... 54
616
Voraussetzungen (Forts.)
Virtual Host Linux ................................................ 57
Virtual Host Windows........................................ 59
W
Wegweiser.................................................................... 28
X
XML-RPC..................................................................... 374
XSS ...................................................................... 248, 406
Z
Zend Framework 1..................................................... 33
Komponentenvergleich ..................................... 48
Umsteiger ................................................................. 33
Zend Framework 2..................................................... 27
Anwendung einrichten ....................................... 53
Einfhrung ............................................................... 27
Installation .............................................................. 61
Komponentenvergleich ..................................... 48
Konzepte .................................................................. 40
Links............................................................................ 31
Nachteile................................................................... 51
Neuerungen ............................................................. 33
Struktur ..................................................................... 71
berblick ber die Komponenten ................. 29
Versionsverwaltung ............................................ 39
Voraussetzungen .................................................. 53
Vorteile ..................................................................... 50
Zend Framework 2-Links ........................................ 31
Zend\Authentication ............................................. 361
Authentifizierungsprozess ............................. 366
Authentifizierungsservice..................... 365, 460
Basic Authentication ......................................... 361
Datenbank-Authentifizierung ...................... 363
DbCrypt-Authentifizierungsadapter.......... 456
Digest Authentication...................................... 362
HTTP-Authentifizierung ................................... 361
Ldap ......................................................................... 368
Login-Formular................................................... 365
Logout-Formular................................................ 365
Zend\Barcode ............................................................ 314
Zend\Cache.................................................................. 92
Capabilities ............................................................. 94
Patterns.................................................................... 95
Plugins ...................................................................... 94
Storages ................................................................... 92
Zend\Code ................................................................ 605
Index
Zend\Config................................................................ 90
ACL cachen ............................................................ 357
Factory ...................................................................... 91
Kaskadierendes Laden........................................ 82
PHP-Array einlesen .............................................. 91
Reader ...................................................................... 90
Writer......................................................................... 91
YAML-Untersttzung installieren.................. 91
Zend\Console........................................................... 605
Zend\Crypt................................................................. 376
DbCrypt-Authentifizierungsadapter ......... 456
Zend\Db ...................................................................... 257
Datenbankadapter ............................................ 258
RowGateway ........................................................ 278
SQL-Abfragen ....................................................... 265
TableGateway ....................................................... 271
Zend\Db\Adapter.................................................... 258
Entitt-Klasse....................................................... 262
Hydrator................................................................. 263
Konfiguration ...................................................... 258
Lesende Abfragen .............................................. 260
Queries ................................................................... 260
ResultSet................................................................. 262
Schreibende Abfragen....................................... 261
Statements ............................................................ 261
Zend\Db\RowGateway.......................................... 278
Daten lesen............................................................ 279
Daten schreiben .................................................. 279
Entitt-Klasse...................................................... 280
RowGatewayFeature............................... 275, 280
Zend\Db\Sql .............................................................. 265
Alter Table ............................................................ 270
Create Table ......................................................... 270
Delete...................................................................... 268
Drop Table ............................................................ 270
Insert....................................................................... 268
Join........................................................................... 266
Select........................................................................ 265
Update ................................................................... 268
Zend\Db\Sql\Ddl.................................................... 270
Zend\Db\TableGateway ........................................ 271
Beispiel .................................................................... 423
Daten schreiben .................................................. 273
Datenbankzugriffe loggen.............................. 275
Entitt-Klasse....................................................... 272
EventFeature ........................................................ 275
Formular ............................................................... 494
GlobalAdapterFeature...................................... 275
MasterSlaveFeature........................................... 275
MetadataFeature................................................ 275
RowGatewayFeature............................... 275, 280
Zend\Db\TableGateway (Forts.)
Verknpfungstabelle ........................................ 488
Zend\Debug ............................................................. 605
Zend\Di ........................................................................ 141
Automatische Erkennung................................ 141
Definition kompilieren..................................... 144
Konfiguration ....................................................... 147
Tipps ........................................................................ 150
Zend\Dom................................................................. 605
Zend\Escaper ............................................................. 312
Zend\EventManager............................................... 117
Einfhrung ............................................................. 117
EventManagerAwareInterface ...................... 118
Listener Closures.................................................. 119
Listener-Aggregate ............................................. 121
MvcEvent ............................................................... 205
Objekte injizieren ............................................... 432
Parameter bergeben........................................ 124
Zend\SharedEventManager............................ 124
Zend\Feed ................................................................. 309
FeedModel.............................................................. 311
Feeds lesen ........................................................... 309
Feeds schreiben ................................................... 310
FeedStrategy ......................................................... 311
Zend\Filter ................................................................. 103
Beispiel.................................................................... 426
Benutzereingaben filtern ................................ 427
Eigene Filter ................................................ 107, 404
Filterketten............................................................ 107
Parameter bergeben....................................... 105
Standardfilter ...................................................... 104
Statische Filter ..................................................... 106
Zend\Form................................................................. 322
Annotationen ...................................................... 343
Ausgabe mit View-Helpern ............................ 333
Beispiel.......................................................... 428, 494
Collections............................................................. 328
Datei-Uploads...................................................... 346
Einfhrung ............................................................ 323
Factory........................................................... 324, 326
Fieldset erweitern ............................................... 326
Fieldsets.................................................................. 325
Formularelemente .............................................. 331
HTML5-Elemente ................................................ 332
InputFilter ............................................................. 337
InputFilterProviderInterface ......................... 338
Konfiguration ...................................................... 324
Objekt erstellen ................................................... 323
Objekte anbinden.............................................. 340
spezielle View-Helper........................................ 334
Standardelemente .............................................. 331
617
Index
Zend\Form (Forts.)
Twitter Bootstrap ............................................... 337
Upload durchfhren......................................... 348
Uploadformular .................................................. 347
Validierung ........................................................... 337
Validierungsgruppe........................................... 338
Zend\Http\Client ................................................... 369
Authentifizierung ................................................ 371
Cookies................................................................... 370
HTTP-Anfrage versenden ............................... 369
RESTful-Webservice testen.............................. 223
Verbindungsadapter ........................................ 370
Zend\I18n.................................................................. 289
ext/intl ...................................................................... 56
Translator ............................................................. 289
Translator konfigurieren................................. 291
Translator-Service .............................................. 292
View-Helper .......................................................... 292
Zend\Validator Fehlermeldungen ..... 294, 402
Zend\InputFilter....................................................... 315
eigenstndige Klasse......................................... 318
Factory ..................................................................... 317
InputFilterProviderInterface.......................... 338
Input-Objekte ........................................................ 315
Konfiguration ....................................................... 317
Objekt erstellen..................................................... 315
Zend\Json ................................................................... 312
Zend\Ldap ................................................................. 368
Zend\Loader ................................................................ 87
ClassMap generieren........................................... 89
ClassMapAutoloader .......................................... 88
eigenen Autoloader erstellen.......................... 90
StandardAutoloader ........................................... 88
Zend\Log...................................................................... 96
Datenbankzugriffe loggen.............................. 275
Fehler loggen ....................................................... 206
Filter ........................................................................... 98
Formatter................................................................. 98
Logger....................................................................... 96
Writer......................................................................... 98
Zend\Mail .................................................................... 99
E-Mail-Nachricht erstellen ............................. 100
E-Mail-Nachricht versenden ......................... 100
E-Mail-Nachrichten abrufen .......................... 102
MIME-Nachrichten erstellen .......................... 101
Zend\Math ................................................................ 605
Zend\Memory ......................................................... 605
Zend\Mime ................................................................ 101
Zend\ModuleManager ........................................... 151
Anwendungsmodul entwickeln.................... 169
Assets........................................................................ 155
618
Zend\ModuleManager (Forts.)
Autoloading .......................................................... 157
Controller konfigurieren ................................. 164
Controller-Plugins konfigurieren................. 166
Einfhrung .............................................................. 151
Fremdmodule ....................................................... 179
Konfiguration ............................................... 155, 157
Konfigurationsdaten ......................................... 158
Konfigurationsschlssel................................... 159
Library-Modul ...................................................... 177
Modulaufbau ........................................................ 152
Modul-Klasse ........................................................ 153
Services konfigurieren....................................... 161
Source-Verzeichnis ............................................. 156
Tests.......................................................................... 156
View-Helper konfigurieren.............................. 167
Views ........................................................................ 157
Weitere Konfigurationen ................................ 169
Zend\Mvc .................................................................... 183
Application ........................................................... 184
Controller ............................................................... 211
Controller, Beispiel............................................ 440
Einfhrung ............................................................. 183
Events...................................................................... 205
Routing................................................................... 192
Services ................................................................... 189
Zend\Mvc\Application ......................................... 184
Bootstrapping...................................................... 186
Initialisierungsprozess..................................... 184
Verarbeitung ........................................................ 188
Zend\Navigation ..................................................... 295
Acl............................................................................. 301
Beispiel..................................................................... 415
Container............................................................... 295
Konfiguration ...................................................... 297
Men im Seitenkopf .......................................... 399
Mens ausgeben................................................ 300
MVC-Seiten ........................................................... 296
NavigationFactory ............................................ 299
Routing................................................................... 296
Seiten....................................................................... 295
URI-Seiten.............................................................. 295
View-Helper .......................................................... 299
Zend\Paginator........................................................ 302
Adapter................................................................... 303
Paginierung .......................................................... 302
Seitennavigation ................................................ 305
Seitennavigation View-Script....................... 308
Seitennavigation View-Skript ...................... 403
View-Helper .......................................................... 305
Index
Zend\Soap (Forts.)
WSDL-Caching abschalten .............................. 371
Zend\Stdlib................................................................. 377
Hydrator ................................................................. 377
Zend\Tag...................................................................... 313
Zend\Text.................................................................. 606
Zend\Uri .................................................................... 606
Zend\Validator......................................................... 108
eigenen Validator erstellen ............................. 113
Fehlermeldungen anpassen............................. 115
Fehlermeldungen bersetzen .............. 294, 402
Parameter bergeben........................................ 110
Standardvalidatoren ........................................ 109
Statische Validatoren ......................................... 111
Validatorketten.................................................... 112
Zend\Version........................................................... 606
Zend\View.................................................................. 237
Ablauf...................................................................... 238
Beispiel.................................................................... 239
Konfiguration ..................................................... 240
Layout..................................................................... 395
Renderer................................................................. 245
Resolver .................................................................. 244
Strategies............................................................... 245
Teilkomponenten ............................................... 237
Template-Engines .............................................. 256
View-Helper .......................................................... 248
ViewModel ............................................................. 241
View-Scripts.......................................................... 247
View-Scripts, Beispiel ............................... 443, 447
Zend\XmlRpc............................................................ 374
Caching ................................................................... 375
Client einsetzen.................................................... 375
Server bereitstellen ............................................ 374
ZendDeveloperTools .............................................. 179
ZfcBase.......................................................................... 181
ZfcTwig ........................................................................ 256
ZfcTwitterBootstrap............................................... 337
ZfcUser ......................................................................... 181
ZFTool ............................................................................ 69
Zielgruppe.................................................................... 28
619