You are on page 1of 63

Ralf Eggert

Zend Framework 2
Das Praxisbuch

Auf einen Blick

Auf einen Blick


TEIL I

Die Grundlagen

Einfhrung in das Zend Framework 2 .............................................................

27

Neuerungen im Zend Framework 2 .................................................................

33

Das Zend Framework einrichten ......................................................................

53

TEIL II

Die Komponenten

Basis-Komponenten .............................................................................................

Der Event-Manager ............................................................................................... 117

Service Location & Dependency Injection ..................................................... 127

Der Modul-Manager ............................................................................................. 151

MVC-Komponenten .............................................................................................. 183

View-Komponenten .............................................................................................. 237

10

Datenbank-Komponenten .................................................................................. 257

11

Ausgabe-Komponenten ...................................................................................... 289

12

Formularverarbeitung .......................................................................................... 315

13

Benutzermanagement ......................................................................................... 351

14

Sonstige Komponenten ....................................................................................... 369

TEIL III

87

Die Module

15

Das Anwendungsmodul ...................................................................................... 383

16

Das Blog-Modul ...................................................................................................... 411

17

Das Benutzer-Modul ............................................................................................. 453

18

Das Pizza-Modul ..................................................................................................... 483

19

Das Kommentar-Modul ....................................................................................... 505

20

Das Spamabwehr-Modul .................................................................................... 525

21

Das CMS-Modul ...................................................................................................... 549

22

Das Shop-Modul ..................................................................................................... 565

Inhalt

Inhalt
Geleitwort ..............................................................................................................................................
Vorwort ..................................................................................................................................................
Vorwort des Autors zur Vorauflage ..............................................................................................

TEIL I

19
21
23

Die Grundlagen

Einfhrung in das Zend Framework 2

27

1.1

Abgrenzung zu anderen PHP-Frameworks ........................................................

27

1.2

Die Zielgruppe des Buches ....................................................................................

28

1.3

Wegweiser ................................................................................................................

28

1.4

berblick ber die Komponenten ........................................................................

29

1.5

Listings, Projektdateien, Programmierrichtlinien ............................................

31

1.6

Der Zend Framework 2-Kosmos ...........................................................................

31

1.7

Links zum Buch ........................................................................................................

32

Neuerungen im Zend Framework 2

33

2.1

Begrifflichkeiten ......................................................................................................

33

2.2

PHP-Version ..............................................................................................................
PHP-Namespaces .......................................................................................
Closures .......................................................................................................
Late Static Binding .....................................................................................

34
34
36
38

2.3

Git und GitHub .........................................................................................................

39

2.4

Neue Konzepte ........................................................................................................

2.2.1
2.2.2
2.2.3

2.4.1

Verbesserte Modularitt ...........................................................................

2.4.2

Dependency Injection ................................................................................

2.4.3
2.4.4

Service-Locator ...........................................................................................
Ereignisgesteuerte Architektur ................................................................

40
40
41
43
45

2.5

Komponentenvergleich .........................................................................................

48

2.6

Vor- und Nachteile des ZF2 ...................................................................................

50
5

Inhalt

Das Zend Framework einrichten

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

Zend Framework 2 installieren .............................................................................


3.2.1
3.2.2

Installation aus einem ZIP-Paket ..............................................................


Installation mit Pyrus ................................................................................

3.2.3

Installation mit Composer ........................................................................

SkeletonApplication installieren .........................................................................


3.3.1
3.3.2
3.3.3

3.4

PHP-Version ................................................................................................
PHP-Extensions ..........................................................................................
Apache 2-Konfiguration ............................................................................
Virtual Host einrichten unter Linux .........................................................
Virtual Host einrichten unter Windows ..................................................
Weitere Informationen .............................................................................

Installation aus einem ZIP-Paket ..............................................................


Installation mit Git .....................................................................................
Einrichtung mit Composer ........................................................................

Struktur einer Zend Framework 2-Anwendung ................................................


3.4.1
3.4.2
3.4.3
3.4.4
3.4.5
3.4.6
3.4.7

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

Storage-Plugins und Capabilities .............................................................


Cache-Patterns ...........................................................................................

Zend\Log ...................................................................................................................
4.4.1
4.4.2

Zusammenspiel der Teilkomponenten ...................................................


Writer ..........................................................................................................

4.4.3
4.4.4

Formatter ....................................................................................................
Filter .............................................................................................................

Zend\Mail und Zend\Mime ..................................................................................


4.5.1
4.5.2
4.5.3
4.5.4

4.6

Zend\Filter ................................................................................................................
4.6.1
4.6.2
4.6.3
4.6.4

4.7

Eine E-Mail-Nachricht erstellen ................................................................


Eine E-Mail-Nachricht versenden .............................................................
MIME-Nachricht erstellen .........................................................................
E-Mail-Nachrichten abrufen .....................................................................
Standardfilter .............................................................................................
Statische Filter ............................................................................................
Filterketten .................................................................................................
Eigenen Filter erstellen ..............................................................................

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

Listener mit Closures umsetzen ...........................................................................

119

5.4

Listener mit Aggregaten umsetzen .....................................................................

121

5.5

bergabe von Parametern an Listener ...............................................................

124

5.6

SharedEventManager .............................................................................................

124

Inhalt

Service Location & Dependency Injection

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

Automatische Erkennung mit RuntimeDefinition .............................


Definition kompilieren mit CompilerDefinition .................................
Abhngigkeiten konfigurieren .................................................................
Zend\Di richtig nutzen ..............................................................................

141
141
144
147
150

Der Modul-Manager

151

7.1

Einfhrung ................................................................................................................

151

7.2

Aufbau eines Moduls ..............................................................................................

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

Autoloading konfigurieren .......................................................................


Konfigurationsdaten bereitstellen ..........................................................
Services konfigurieren ...............................................................................
Controller konfigurieren ...........................................................................
Controller-Plugins konfigurieren .............................................................
View-Helper konfigurieren .......................................................................
Weitere Konfigurationen ..........................................................................

Ein Anwendungsmodul entwickeln ....................................................................


7.4.1
7.4.2

Die Modul-Klasse .......................................................................................


Das Konfigurationsverzeichnis .................................................................
Assets im Public-Verzeichnis ....................................................................
Das Source-Verzeichnis .............................................................................
Tests ............................................................................................................
Das View-Verzeichnis ................................................................................

157
157
158
161
164
166
167
169

169
Die Modul-Klasse ....................................................................................... 170
Modulkonfiguration .................................................................................. 171

Inhalt

Controller und View-Script einrichten .....................................................


Request-Parameter verwenden ...............................................................

173
175

7.5

Library-Modul erstellen .........................................................................................

177

7.6

Fremdmodule installieren .....................................................................................

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

Das route-Event fr die Sprachfestlegung nutzen .............................


Das dispatch.error-Event fr das Logging nutzen ..............................
Das finish-Event fr die Zeitmessung nutzen ....................................
Einfhrung ..................................................................................................
Action-Controller .......................................................................................
Zugriff auf Objekte ....................................................................................
Services injizieren .......................................................................................
RESTful-Controller ......................................................................................

Controller-Plugins ...................................................................................................
8.7.1

Zugriff auf Plugins .....................................................................................

205
205
206
209
211
211
212
214
215
218
224
224
9

Inhalt

8.7.2
8.7.3

Das Layout-Plugin ..................................................................................


Das Url-Plugin ........................................................................................

8.7.4
8.7.5
8.7.6
8.7.7
8.7.8
8.7.9
8.7.10

Das Redirect-Plugin ................................................................................


Das Forward-Plugin ...............................................................................
Das Params-Plugin .................................................................................
Das PostRedirectGet-Plugin ..................................................................
Das FilePostRedirectGet-Plugin ............................................................
Das FlashMessenger-Plugin ..................................................................
Ein eigenes Plugin erstellen ......................................................................

225
225
227
227
229
229
231
233
234

View-Komponenten

237

9.1

Einfhrung in Zend\View ......................................................................................

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

Resolver, Renderer und Strategies ......................................................................


9.3.1
9.3.2
9.3.3

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

10.1 Das Datenbankmodell ............................................................................................

257

10.2 Datenbankadapter ..................................................................................................

258

10

Inhalt

10.2.1
10.2.2
10.2.3
10.2.4

Konfiguration eines Adapters ...................................................................


Ausfhren von lesenden Abfragen ..........................................................

258
260
Ausfhren von schreibenden Abfragen .................................................. 261
ResultSet fr Adapter konfigurieren ........................................................ 262

10.3 SQL-Abfragen generieren ......................................................................................


10.3.1
10.3.2
10.3.3

Lesende Abfragen generieren ...................................................................


Schreibende Abfragen generieren ...........................................................
Abfragen mit DDL generieren ...................................................................

265
265
268
270

10.4 Gateway-Klassen .....................................................................................................


10.4.1
10.4.2
10.4.3

271
Zend\Db\TableGateway ........................................................................... 271
TableGateway-Features ............................................................................ 274
Zend\Db\RowGateway ............................................................................. 278

10.5 Doctrine 2 ..................................................................................................................


10.5.1
10.5.2
10.5.3

Installation und Konfiguration .................................................................


Modul und Entitten vorbereiten ............................................................
Doctrine 2 einsetzen ..................................................................................

11 Ausgabe-Komponenten

281
281
282
286

289

11.1 Zend\I18n ..................................................................................................................


11.1.1
11.1.2
11.1.3

289
Translator .................................................................................................... 289
View-Helper ................................................................................................ 292
Fehlermeldungen fr Zend\Validator bersetzen ................................. 294

11.2 Zend\Navigation .....................................................................................................


11.2.1
11.2.2
11.2.3
11.2.4

Container und Seiten anlegen ..................................................................


Navigation konfigurieren ..........................................................................
Navigation ausgeben ................................................................................
Navigation und ACL ...................................................................................

11.3 Zend\Paginator .......................................................................................................


11.3.1
11.3.2

Adapter fr Zend\Paginator .....................................................................


Seitennavigation ........................................................................................

295
295
297
299
301
302
303
305

11.4 Zend\Feed .................................................................................................................


11.4.1
11.4.2
11.4.3

309
Feeds lesen .................................................................................................. 309
Feeds schreiben .......................................................................................... 310
Feeds mit Zend\Mvc und Zend\View ...................................................... 311

11.5 Weitere Hilfskomponenten ..................................................................................


11.5.1

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

12.1 Zend\InputFilter ......................................................................................................

315
315
317
318
320
322

12.1.1
12.1.2
12.1.3
12.1.4
12.1.5

Ein InputFilter-Objekt erstellen ................................................................


Factory mit Konfigurationsdaten nutzen ................................................
InputFilter als eigenstndige Klassen ......................................................
Hierarchische InputFilter ..........................................................................
InputFilter im MVC ....................................................................................

12.2 Zend\Form ................................................................................................................


12.2.1
12.2.2
12.2.3
12.2.4
12.2.5
12.2.6
12.2.7
12.2.8
12.2.9
12.2.10

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

13.1 Zend\Session ............................................................................................................


13.1.1
13.1.2
13.1.3

351
Mit Session-Containern arbeiten ............................................................. 351
Session-Manager verwenden ................................................................... 352
Sessions in der Datenbank speichern ...................................................... 353

13.2 Zend\Permissions\Acl ............................................................................................


13.2.1
13.2.2
13.2.3
13.2.4

Begrifflichkeiten .........................................................................................
ACL definieren ............................................................................................
ACL abfragen ..............................................................................................
ACL cachen ..................................................................................................

13.3 Zend\Permissions\Rbac ........................................................................................


13.3.1

12

Begrifflichkeiten .........................................................................................

355
355
355
357
357
358
358

Inhalt

13.3.2
13.3.3

RBAC definieren .........................................................................................


RBAC abfragen ............................................................................................

359
360

13.4 Zend\Authentication .............................................................................................


13.4.1
13.4.2
13.4.3

361
361
363
Authentifizierungsservice ......................................................................... 365
Per HTTP authentifizieren .........................................................................
Gegen eine Datenbanktabelle authentifizieren .....................................

13.5 Zend\Ldap .................................................................................................................

368

14 Sonstige Komponenten

369

14.1 Zend\Http .................................................................................................................

369
369
370
370

14.1.1
14.1.2
14.1.3

HTTP-Anfrage senden und verarbeiten ...................................................


Verbindungsadapter ..................................................................................
Fortgeschrittener Einsatz ..........................................................................

14.2 Zend\Soap ................................................................................................................


14.2.1
14.2.2

371
SOAP-Server bereitstellen ......................................................................... 371
SOAP-Client einsetzen ............................................................................... 373

14.3 Zend\XmlRpc ...........................................................................................................


XML-RPC-Server bereitstellen ...................................................................
XML-RPC-Client einsetzen .........................................................................

374
374
375

14.4 Zend\Crypt ...............................................................................................................

376

14.5 Zend\Stdlib ...............................................................................................................

377

14.3.1
14.3.2

TEIL III

Die Module

15 Das Anwendungsmodul

383

15.1 Anforderungen ........................................................................................................

383

15.2 Anwendungsmodul konfigurieren ......................................................................

384

15.3 Eigene View-Helper ................................................................................................

388
388
389
391
393

15.3.1
15.3.2
15.3.3
15.3.4

Der View-Helper PageTitle ....................................................................


Der View-Helper ShowMessages .........................................................
Der View-Helper ShowForm .................................................................
Der View-Helper Date ............................................................................

13

Inhalt

15.4 Mehrstufiges Seitenlayout ..................................................................................

395

15.5 Men im Seitenkopf einrichten .........................................................................

399

15.6 Controller und View-Scripts ................................................................................

401

15.7 Meldungen der Validatoren bersetzen ..........................................................

402

15.8 Pagination ...............................................................................................................

403

15.9 Eigene Filter ............................................................................................................


Der StringToUrl-Filter ..........................................................................
Der StringHtmlPurifier-Filter ..............................................................
Konfiguration fr beide Filter .................................................................

404
404
406
407

15.10 CKEditor ...................................................................................................................

409

16 Das Blog-Modul

411

16.1 Anforderungen ........................................................................................................

411

16.2 Das Blog-Modul einrichten ...................................................................................

412

15.9.1
15.9.2
15.9.3

16.3 Modelinfrastruktur .................................................................................................


16.3.1
16.3.2

419
Datenbank einrichten ................................................................................ 419
Klassen erstellen ........................................................................................ 421

16.4 Filter und Formulare ...............................................................................................


16.4.1
16.4.2
16.4.3

Filter und Validierung ................................................................................


Formularklasse ...........................................................................................
Factories ......................................................................................................

425
426
427
429

16.5 Den Blog-Service einrichten ..................................................................................


16.5.1
16.5.2

431
Formular-Objekte injizieren ...................................................................... 432
Der Blog-Service berblick ..................................................................... 433

16.6 ffentlicher Bereich ................................................................................................


16.6.1
16.6.2

Action-Controller einrichten .....................................................................


View-Scripts einrichten .............................................................................

16.7 Administrationsbereich .........................................................................................

440
440
443

Action-Controller einrichten .....................................................................


View-Scripts einrichten .............................................................................

444
445
447

16.8 Optimierungen ........................................................................................................

451

16.7.1
16.7.2

14

Inhalt

17 Das Benutzer-Modul

453

17.1 Anforderungen ........................................................................................................

453

17.2 Vorbereitungen .......................................................................................................

454

17.3 Authentifizierung und Autorisierung .................................................................


Authentifizierungsadapter .......................................................................
Authentifizierungsservice .........................................................................
Autorisierungsservice ................................................................................
Konfiguration der Benutzerrechte ...........................................................

455
456
460
461
464

17.4 User-Service einrichten ..........................................................................................

466

17.3.1
17.3.2
17.3.3
17.3.4

17.5 View-Helper einrichten ..........................................................................................


17.5.1
17.5.2

470
Der View-Helper UserIsAllowed ........................................................... 470
Der View-Helper UserShowWidget ..................................................... 471

17.6 UserListener einrichten ..........................................................................................

475

17.7 ffentlicher Bereich ................................................................................................

478
478
481

17.7.1
17.7.2

Den Action-Controller einrichten .............................................................


View-Scripts einrichten .............................................................................

18 Das Pizza-Modul

483

18.1 Anforderungen ........................................................................................................

483

18.2 Vorbereitungen .......................................................................................................

484

18.3 Modelinfrastruktur .................................................................................................

485

18.4 Pizza-Service einrichten .........................................................................................

490

18.5 Formulare einrichten ..............................................................................................

494

18.6 Bild-Upload einrichten ...........................................................................................

498

18.7 Administrationsbereich .........................................................................................

501

18.8 Ein Pizza-Karussell einrichten ...............................................................................

502

19 Das Kommentar-Modul

505

19.1 Anforderungen ........................................................................................................

505

19.2 Vorbereitungen .......................................................................................................

506
15

Inhalt

19.3 Modul-Konfiguration .............................................................................................

508

19.4 View-Helper einrichten ..........................................................................................


Der View-Helper CommentShowLinks ................................................
Der View-Helper CommentShowComments .....................................
Einsatz der View-Helper ............................................................................

511
511
513
516

19.5 Kommentare anlegen ............................................................................................

519

19.6 Kommentar-Service erweitern .............................................................................

521

20 Das Spamabwehr-Modul

525

20.1 Anforderungen ........................................................................................................

525

20.2 Vorbereitungen .......................................................................................................

526

20.3 Modul-Konfiguration .............................................................................................

527

20.4 Autoloading ..............................................................................................................

529

20.5 Spamabwehr-Service ..............................................................................................

530

20.6 Controller-Plugin .....................................................................................................

532

20.7 Der View-Helper SpamCheck ...........................................................................

534

20.8 Spamabwehr im Kommentar-Modul nutzen ....................................................


Konfiguration anpassen ............................................................................
Entitt anpassen ........................................................................................
Den Kommentar-Service anpassen ..........................................................
Action-Controller anpassen ......................................................................
View-Scripts anpassen ..............................................................................

535
536
537
537
539
542

20.9 Das Spamabwehr-Modul im Einsatz ...................................................................

545

21 Das CMS-Modul

549

21.1 Anforderungen ........................................................................................................

549

21.2 Vorbereitungen .......................................................................................................

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

21.3 Ein Formular einrichten .........................................................................................

555

21.4 CMS-Service erweitern .........................................................................................

556

21.5 View-Helper fr das Bearbeiten erweitern ......................................................

558

21.6 JavaScript-Funktionen ..........................................................................................

560

21.7 Controller einrichten ............................................................................................

562

22 Das Shop-Modul

565

22.1 Anforderungen ......................................................................................................

565

22.2 Vorbereitungen .....................................................................................................

566

22.3 Modelinfrastruktur ...............................................................................................

567

22.4 Bestellservice ..........................................................................................................

573

22.5 Warenkorb-Service ...............................................................................................

576

22.6 Controller-Plugin ...................................................................................................

580

22.7 View-Helper ............................................................................................................

581
22.7.1 Der View-Helper ShowBasket ............................................................. 581
22.7.2 Der View-Helper GetOrder .................................................................. 586

22.8 Der Warenkorb-Controller ..................................................................................

587

22.9 Warenkorb-View-Scripts .....................................................................................

589

22.10 Den Warenkorb im Pizza-Modul einsetzen .....................................................

593

22.11 Das Warenkorb-Modul im Einsatz .....................................................................

594

Anhang

599

Installation der Projektdateien ............................................................................


A.1
ZIP-Pakete downloaden .........................................................................
A.2
Dateien von GitHub klonen ...................................................................
A.3
Installation ohne Composer ..................................................................
A.4
Virtual Host anpassen .............................................................................

601
601
602
602
603

Weitere Komponenten ..........................................................................................

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

Neuerungen im Zend Framework 2

function bakePizza(PizzaInterface $pizza)

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

Neuerungen im Zend Framework 2

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

Listing 2.4 Beispiel fr eine Closure-Definition mit bergebenen Variablen

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

Neuerungen im Zend Framework 2

2.2.3

Late Static Binding

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

Git und GitHub

Git und GitHub

Eine technische Umstellung, die vorwiegend die Zend Framework 2-Entwickler


betrifft, ist der Wechsel von Subversion (SVN) zu Git. Bei SVN und Git handelt es sich
um Software fr die Versionsverwaltung von Dateien. Das Zend Framework 1 hat von
Beginn an auf SVN gesetzt. Fr das Zend Framework 2 wurde frhzeitig entschieden,
sich die Vorteile von Git fr die Entwicklung des ZF2 zunutze zu machen. Doch wieso
kam es dazu?
Das Zend-Framework-Team versprach sich von dem Wechsel eine verbesserte Produktivitt, sodass Patches und Verbesserungsvorschlge der Framework-Anwender
schneller eingepflegt werden knnen. Die Erfahrung der letzten Jahre in der Entwicklung vom Zend Framework 2 hat diese Hoffnung mehr als besttigt. Mittlerweile ist
auch der Issue Tracker, in dem Anwender Bugs und Feature Requests einstellen knnen, auch zu GitHub gewechselt. Somit liegen die wichtigsten Entwicklungstools nun
auf einer Plattform und sind nicht ber mehrere Tools verteilt.
Git gibt es fr alle wichtigen Betriebssysteme wie Linux, Windows und Mac OS X
(http://git-scm.com/). Wenn Sie eine Anwendung mit dem Zend Framework erstellen mchten, mssen Sie fr Ihre Versionsverwaltung nicht unbedingt auch zu Git
wechseln. Es ist aber dennoch hilfreich, wenn auf Ihrem Entwicklungsrechner auch
Git zur Verfgung steht, da dies die Installationen der SkeletonApplication (siehe
Abschnitt 3.3, SkeletonApplication installieren) sowie von Fremdmodulen vereinfachen kann.
Bei GitHub handelt es sich um einen webbasierten Hosting-Dienst fr Softwareprojekte (https://github.com/). Dort kann jeder Entwickler eigene ffentliche Repositories fr seine Softwareprojekte anlegen und pflegen oder bestehende kopieren, um
sie an eigene Bedrfnisse anzupassen.
Nicht nur das Zend Framework 2 wird in einem Repository auf GitHub gepflegt (siehe
https://github.com/zendframework/). Auch viele ZF2-Fremdmodule sind dort zu finden; als Beispiel seien die Module der ZF-Commons-Initiative genannt (siehe https://
github.com/ZF-Commons).
Wer sich mit Git und GitHub noch nicht auskennt, der braucht keine Angst zu haben,
auer mit dem neuen Zend Framework 2 auch noch Stunden mit dem Lernen von Git
und GitHub verbringen zu mssen. Mit folgenden Links gelingt der Einstieg auch
Anfngern:

http://try.github.com/
Ein schn gemachtes, interaktives Tutorial fr den allgemeinen Einstieg in Git und
GitHub

39

Neuerungen im Zend Framework 2

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

Im Zend Framework 2 wurde eine Vielzahl neuer Konzepte implementiert, die im


Zend Framework 1 noch nicht oder nur teilweise umgesetzt waren. Diese Konzepte
wurden nicht von den Zend Framework 2-Entwicklern erfunden, sondern werden
schon lnger in der Softwareentwicklung eingesetzt. Neu ist der Einsatz im ZF2.
Mithilfe dieser Konzepte wurde die Entwicklung von Zend Framework 2-Anwendungen noch einmal um ein Vielfaches vereinfacht. Einsteiger und Umsteiger mssen
diese Lernkurve jedoch erst einmal erklimmen. Sobald Sie aber die Konzepte verstanden und verinnerlicht haben, werden Sie diese in Zukunft nicht mehr missen wollen.
Die Konzepte werden in diesem Abschnitt unabhngig vom Zend Framework 2 erlutert. Auf die konkreten Zend Framework 2-Implementierungen wird entsprechend
verwiesen.

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

Somit kann eine Zend Framework 2-Anwendung verschiedene Anwendungsmodule


wie ein Blog, einen Shop oder ein Kommentarmodul einsetzen. Und Sie knnen diese
Module in der Regel mit vertretbarem Aufwand in anderen Zend Framework 2Anwendungen ebenfalls einsetzen.
Zustzlich gibt es eine Vielzahl an ZF2-Fremdmodulen, die Sie in Ihre Projekte integrieren knnen. Diese Module bieten Benutzermanagement, Doctrine 2-Integration,
Twitter Bootstrap-Untersttzung, Asset-Management und vieles mehr.
In Kapitel 7, Der Modul-Manager, wird die Implementation der neuen Modularitt
detailliert erlutert. Auch die Entwicklung von Anwendungsmodulen und die Installation von Fremdmodulen werden anhand praktischer Beispiele beleuchtet.

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

Neuerungen im Zend Framework 2

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());

$pizzaSpeciale = new Pizza(new


$pizzaSpeciale->addTopping(new
$pizzaSpeciale->addTopping(new
$pizzaSpeciale->addTopping(new
$pizzaSpeciale->addTopping(new

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

Neuerungen im Zend Framework 2

$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());

$sl = new ServiceLocator();


$sl->set('pizza-salami', $factoryClosure);
var_dump($sl->get('pizza-salami'));
Listing 2.10 Implementation eines Service-Locators mit Closures

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

Bei der ereignisgesteuerten Architektur (event-driven architecture) handelt es sich


um ein weiteres Entwurfsmuster, das im Zend Framework 2 neu implementiert
wurde. Bei diesem Prinzip wird die Interaktion von lose gekoppelten Komponenten
durch Ereignisse (Events) gesteuert.
Fr eine beispielhafte Implementation bentigen wir einen Event-Manager, der auch
als Event-Dispatcher bezeichnet wird. Dessen Aufgabe ist es, eine Reihe von EventListenern zu verwalten. Diese Listener warten darauf, dass ein Ereignis angestoen
wird (to trigger an event). Wird das Ereignis angestoen, so knnen die Aufgaben
ausgefhrt werden.
Fr unser nchstes Beispiel stellen wir uns den Eingang einer Pizzabestellung vor.
Sobald die neue Bestellung gespeichert wird, muss eine Reihe von Aufgaben erledigt
werden. Diese Aufgaben knnten der Versand einer Bestellbesttigung, die Aktualisierung des Warenbestands und das Backen der Pizza sein. Vor dem Speichern der
Bestellung knnte zudem der Warenbestand geprft werden.

45

Neuerungen im Zend Framework 2

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();

public function attach($event, EventListener $listener)


{
$this->listeners[$event][] = $listener;
}
public function trigger($event)
{
foreach ($this->listeners[$event] as $listener) {
$listener->$event();
}
}
}
$em = new EventManager();
$em->attach('postOrder', new SendConfirmation());
$em->attach('postOrder', new BakePizza());
$em->attach('postOrder', new UpdateStock());
$em->attach('preOrder', new CheckStock());
$em->trigger('preOrder');
$pizzaOrder = new PizzaOrder();
$em->trigger('postOrder');
Listing 2.11 Beispiel fr einen Event-Manager

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

Neuerungen im Zend Framework 2

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

Tabelle 2.1 Alte ZF1-Komponenten im neuen Gewand (Stand: ZF 2.2.0)

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

Tabelle 2.1 Alte ZF1-Komponenten im neuen Gewand (Stand: ZF 2.2.0) (Forts.)

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.2 Neue ZF2-Komponenten mit neuem Glanz (Stand: ZF 2.2.0)

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

Neuerungen im Zend Framework 2

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.)

Diese Liste ist interessant, da Komponenten wie Zend_Search_Lucene und Zend_Pdf in


der Anfangszeit groes Interesse in der PHP-Community hervorgerufen haben und
so manchen Entwickler erst zum Zend Framework 1 gebracht haben. Die Zeit hat
jedoch bei beiden Komponenten schnell gezeigt, dass sie aus Performance-Grnden
oder wegen fehlender Funktionen in der Praxis nur schwer einsetzbar waren.
Andere Komponenten, wie Zend_Amf, Zend_Gdata oder Zend_InfoCard, sind so speziell,
dass sie nicht mehr zum Framework-Kern gehren. Auch die Webservice-Komponenten aus Zend_Service gehren nicht mehr zum Kern vom ZF2.
Das gleiche Schicksal teilen die beiden Komponenten Zend_Dojo und ZendX_JQuery,
die Untersttzung fr JavaScript-Bibliotheken geboten haben (wobei speziell ZendX_
JQuery nie zum Kern des Zend Framework 1 gezhlt hat). Wer Untersttzung fr Dojo
und jQuery sucht, wird zuknftig auf spezielle Fremdmodule hoffen mssen.
Die Fokussierung auf weniger Kernkomponenten ist ein groes Plus fr das Zend
Framework 2. Dadurch werden die Kapazitten besser auf die wesentlichen Komponenten konzentriert und das Problem mit Komponenten, die nicht oder nur kaum
gepflegt werden, hat sich damit auch gelst.

2.6

Vor- und Nachteile des ZF2

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

Vor- und Nachteile des ZF2

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.

Waren im Zend Framework 1 noch viele Komponenten eng miteinander verzahnt,


so wurde die lose Kopplung der Komponenten mit dem Zend Framework 2 stark
vorangetrieben. Einige Komponenten wie Zend\Form und Zend\View, die im ZF1
eine Vielzahl an Aufgaben bernommen hatten, wurden stark entkoppelt. Selbst
das Zusammenspiel der Zend\Mvc-Komponenten lsst sich so weit aufbohren, dass
Sie den gesamten Prozess der Model-View-Controller-Verarbeitung umgestalten
knnen.

Die neuen Konzepte Dependency Injection, Service-Locator und Event-Manager


entfalten ihr groes Potenzial, sobald Sie diese verinnerlicht haben und tglich
anwenden. Wenn Sie die Lernkurve erst einmal erklommen haben, werden Sie
ungern zum Zend Framework 1 zurckkehren wollen.

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.

Die Konfigurationslastigkeit kann auf den ersten Blick abschrecken. Da es fr viele


Dinge keine festen Konventionen mehr gibt, mssen Sie diese selber konfigurieren. Die SkeletonApplication, die Sie in Abschnitt 3.3, SkeletonApplication instal-

51

Neuerungen im Zend Framework 2

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

Mit Session-Containern arbeiten

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

$pizzaList = array('Pizza Salami', 'Pizza Mais', 'Pizza Melone');


$randomPizza = $pizzaList[array_rand($pizzaList)];
$randomCount = Rand::getInteger(1, 3);
$basket = new Container('basket');
if (!$basket->offsetExists('order')) {
$basketData = array('rows' => array(), 'sum' => 0);
} else {
$basketData = $basket->offsetGet('order');
}
$basketData['rows'][] = $randomCount . 'x ' . $randomPizza;
$basketData['sum' ] = $basketData['sum'] + $randomCount;
$basket->offsetSet('order', $basketData);
Debug::dump($counter->number, '<h5>Zhler</h5>');
Debug::dump($basket->order, '<h5>Warenkorb</h5>');
Listing 13.1 Einsatz von Zend\Session\Container

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();

Sie knnen den Session-Manager auch direkt instanziieren:


use Zend\Session\SessionManager;
$sessionManager = new SessionManager();

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);

Session im Dateisystem speichern


Wenn Sie die Sessions im Dateisystem speichern, sollten Sie mit setSavePath() den
SavePath auf ein Verzeichnis im Projekt umleiten. Ansonsten gibt es Probleme,
wenn mehrere Projekte auf dem Server ihre Sessions im selben Verzeichnis speichern.

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

Sessions in der Datenbank speichern

Standardmig werden Session-Daten durch den SaveHandler auf Dateiebene


gespeichert, wobei Sie den Pfad zu dem Verzeichnis anpassen knnen. Mchten Sie
Session-Daten in einer Datenbank speichern, mssen Sie den SaveHandler anpassen.
Listing 13.2 zeigt den SQLite3-Dump fr die Datenbanktabelle sessions zum Speichern der Session-Daten:
DROP TABLE sessions;
CREATE TABLE sessions (
id varchar(32) primary key,
name varchar(32),
data text,

353

13

13

Benutzermanagement

modified integer,
lifetime integer
);
Listing 13.2 SQL-Dump fr Datenbanktabelle sessions fr SQLite3

Listing 13.3 zeigt die Konfiguration des Session-SaveHandlers DbTableGateway. Zuerst


wird ein Datenbankadapter fr die SQLite3-Datenbank initialisiert, ein TableGateway-Objekt fr die sessions-Tabelle instanziiert und ein Optionen-Objekt fr den
SaveHandler erstellt. Das TableGateway-Objekt und die Optionen werden wiederum
fr die Instanziierung des DbTableGateway-SaveHandler bentigt. Danach sind die
Vorbereitungen abgeschlossen.
use
use
use
use
use
use

Zend\Db\Adapter\Adapter;
Zend\Db\TableGateway\TableGateway;
Zend\Debug\Debug;
Zend\Session\SessionManager;
Zend\Session\SaveHandler\DbTableGateway;
Zend\Session\SaveHandler\DbTableGatewayOptions;

$db = new Adapter(array(


'driver' => 'Pdo_Sqlite',
'database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',
));
$tableGateway = new TableGateway('sessions', $db);
$options
= new DbTableGatewayOptions();
$saveHandler
= new DbTableGateway($tableGateway, $options);
$sessionManager = new SessionManager();
$sessionManager->setSaveHandler($saveHandler);
$sessionManager->start();
$sessionManager->writeClose();
$rows = $tableGateway->select();
foreach ($rows as $row) {
Debug::dump($row->getArrayCopy());
}
Listing 13.3 Session-SaveHandler fr das DbTableGateway ndern

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

Diese ACL beschreibt im Einzelnen folgende Benutzerrechte:

Gste drfen Produkte anzeigen und auflisten.

Kunden drfen Produkte in den Warenkorb legen und alles tun, was Gste drfen.

Mitarbeiter drfen Produkte anlegen und bearbeiten und alles tun, was Kunden
und Gste drfen.

Gste drfen nichts mit Bestellungen machen.

Kunden drfen Bestellungen anlegen und abschicken.

Mitarbeiter drfen Bestellungen verndern, auflisten und abschlieen.

Administratoren drfen alles.

brigens ist der Aufruf von deny() berflssig, da alle Rollen fr alle Ressourcen 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

Listing 13.5 Zend\Permissions\Acl abfragen

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

'namespace' => 'acl',


'ttl'
=> 5,
'cache_dir' => LUIGI_ROOT . '/data/cache',
),
),
'plugins' => array('serializer'),
));
$acl = $cache->getItem('acl');
if (!$acl) {
$acl = new Acl();
[...]
$cache->setItem('acl', $acl);
Debug::dump('ACL in den Cache geschrieben');
} else {
Debug::dump('ACL aus dem Cache gelesen');
}
Listing 13.6 ACL mit Zend\Cache speichern

Details zu Zend\Cache finden Sie in Abschnitt 4.3, Zend\Cache.

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

Zend\Authentication hilft ihnen, die Benutzer Ihrer Anwendung zu authentifizieren.

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

Per HTTP authentifizieren

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

Aufruf von authenticate() erfolgt die Authentifizierung. Das Result-Objekt kann


ausgewertet werden und ermglicht bei Erfolg die Abfrage der angemeldeten Identitt.
use Zend\Authentication\Adapter\Http;
use Zend\Authentication\Adapter\Http\FileResolver;
$sm = $this->getHelperPluginManager()->getServiceLocator();
$response = $sm->get('response');
$request = $sm->get('request');
$adapter = new Http(array(
'accept_schemes' => 'basic',
'realm'
=> 'Luigis Pizza-Service',
'digest_domains' => '/listing/listing1310',
'nonce_timeout' => 3600,
));
$basicResolver = new FileResolver();
$basicResolver->setFile(LUIGI_ROOT . '/data/auth/basic.pw');
$adapter->setBasicResolver($basicResolver);
$adapter->setRequest($request);
$adapter->setResponse($response);
$result = $adapter->authenticate();
if (!$result->isValid()) {
echo 'Du kommst hier nicht rein!';
} else {
$identity = $result->getIdentity();
echo 'Herzlich Willkommen ' . $identity['username'] . '!';
}
Listing 13.10 Basic-HTTP-Authentication mit Http-Adapter

Wenn Sie http://luigis-pizza.local/listing/listing1310 aufrufen, knnen Sie das Beispiel ausprobieren.


Fr die Digest Authentication ist die Passwortdatei unter /data/auth/digest.pw zu
finden (siehe Listing 13.11). Der Aufbau ist derselbe wie bei der Basic Authentication,

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

$digestResolver = new FileResolver();


$digestResolver->setFile(LUIGI_ROOT . '/data/auth/digest.pw');
$adapter->setDigestResolver($digestResolver);
[...]
Listing 13.12 Digest-HTTP-Authentication mit Http-Adapter (gekrzt)

13.4.2

Gegen eine Datenbanktabelle authentifizieren

Mit Zend\Authentication knnen Sie gegen eine Datenbanktabelle authentifizieren.


Listing 13.13 zeigt einen SQLite3-Dump fr die Tabelle users, die die Benutzerdaten
enthlt. Das Passwort fr den Benutzer luigi lautet luigi.
DROP TABLE users;
CREATE TABLE users (
id integer primary key,
name varchar(32),

363

13

Benutzermanagement

pass varchar(32)
);
INSERT INTO "users"
VALUES (1,'luigi','ccebba93f54d6bf2b17f8350e7c12ec4');
Listing 13.13 SQL-Dump fr die Datenbanktabelle users fr SQLite3

Passwortverschlsselung mit Bcrypt


Der Einfachheit halber werden die Passwrter mit md5() verschlsselt. Sicherer ist
eine Verschlsselung mit Bcrypt. In Abschnitt 17.3, Authentifizierung und Autorisierung, finden Sie einen Authentifizierungsadapter, der zur Verschlsselung
Bcrypt verwendet.

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;

class LoginForm extends Form


{
public function __construct()
{
parent::__construct('login');
$nameElement = new Text('name');
$nameElement->setLabel('Benutzername');
$passElement = new Password('pass');
$passElement->setLabel('Passwort');
$submitElement = new Submit('login');
$submitElement->setValue('Anmelden');
$submitElement->setAttribute('class', 'btn');

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

Der AuthenticationService bentigt einen Authentifizierungsadapter (siehe Listing


13.16) Zu Beginn werden der AuthenticationService und das Request-Objekt initialisiert, und es wird geprft, ob eine POST-Anfrage vorliegt. Wenn dies der Fall ist, wird
berprft, ob der Login-Button geklickt, aber kein Benutzername eingegeben wurde.
In diesem Fall wird eine Fehlermeldung festgelegt. Die nchste Prfung schaut nach
dem Login-Button. In diesem Fall werden der Datenbankadapter und der Authentifizierungsadapter konfiguriert, wobei der Authentifizierungsadapter den Benutzernamen und das Passwort bergeben bekommt. Danach wird die Authentifizierung
durchgefhrt. Mgliche Fehlermeldungen werden zwischengespeichert. Die letzte
Prfung schaut nach dem Logout-Button und zerstrt bei Bedarf die aktuelle Identitt und meldet den Nutzer ab. Der Rest des Listings kmmert sich um die Ausgabe
der Meldungen und des Formulars.
use
use
use
use
use
use

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

$authService = new AuthenticationService();


$request = new Request();
if ($request->isPost()) {
if ($request->getPost('login') && !$request->getPost('name')) {
$showMessage = 'Es wurde kein Benutzername eingegeben';
} elseif ($request->getPost('login')) {
$db = new Adapter(array(
'driver' => 'Pdo_Sqlite',
'database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',
));
$authAdapter = new DbTable($db, 'users', 'name', 'pass');
$authAdapter->setIdentity(
strtolower($request->getPost('name'))
);
$authAdapter->setCredential(md5($request->getPost('pass')));

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

Der AuthenticationService lsst sich mit allen Adaptern fr die Authentifizierung


kombinieren. Die Vorgehensweise ist dabei prinzipiell dieselbe, wobei nicht jedes
Mal ein Formular bentigt wird. In Abschnitt 17.3, Authentifizierung und Autorisierung, finden Sie ein Modul, das die Authentifizierung mit der Autorisierung im
MVC-Kontext verknpft.

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

PostgreSQL........................................................ 257, 303


PostRedirectGet Plugin ........................................ 229
Pyrus .............................................................................. 62

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

StringHtmlPurifier-Filter........................... 406, 427


StringToUrl-Filter................................................... 404

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\Permissions\Acl .......................................... 355


ACL abfragen........................................................ 357
ACL cachen ............................................................ 357
ACL definieren...................................................... 355
Autorisierungsservice ....................................... 461
Benutzerrechte prfen..................................... 476
Privilegien.............................................................. 355
Regeln...................................................................... 355
Ressourcen ............................................................ 355
Rollen....................................................................... 355
Zend\Navigation ................................................ 301
Zend\Permissions\Rbac ....................................... 358
Berechtigungen ................................................... 359
Identitten............................................................. 358
RBAC abfragen.................................................... 360
RBAC definieren .................................................. 359
Rollen....................................................................... 358
Zend\ProgressBar.................................................. 606
Zend\Serializer ................................................ 571, 606
Zend\ServiceManager ............................................ 127
AbstractFactories ...................................... 130, 138
Aliases ..................................................................... 130
Factories ......................................................... 130, 131
Initializers...................................................... 130, 135
Instanziierungsarten ........................................ 130
Invokables ............................................................. 130
Konfigurationsdatei........................................... 133
Konfigurationsklasse........................................ 132
ServiceLocatorAwareInterface....................... 137
Services ................................................................... 130
Shared ..................................................................... 130
Tipps........................................................................ 140
Zend\Session.............................................................. 351
Session-Container ............................................... 351
Session-Manager ................................................ 352
Sessions in der Datenbank speichern ......... 353
Zend\Soap ................................................................... 371
AutoDiscover........................................................ 372
Client einsetzen ................................................... 373
Server bereitstellen.............................................. 371

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