Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1...

63
Ralf Eggert Zend Framework 2 Das Praxisbuch

Transcript of Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1...

Page 1: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Ralf Eggert

Zend Framework 2Das Praxisbuch

Page 2: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Auf einen Blick

Auf einen Blick

TEIL I Die Grundlagen

1 Einführung in das Zend Framework 2 ............................................................. 27

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

3 Das Zend Framework einrichten ...................................................................... 53

TEIL II Die Komponenten

4 Basis-Komponenten ............................................................................................. 87

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

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

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

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

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

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

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

12 Formularverarbeitung .......................................................................................... 315

13 Benutzermanagement ......................................................................................... 351

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

TEIL III 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

Page 3: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

5

Inhalt

Geleitwort .............................................................................................................................................. 19

Vorwort .................................................................................................................................................. 21

Vorwort des Autors zur Vorauflage .............................................................................................. 23

TEIL I Die Grundlagen

1 Einführung 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

2 Neuerungen im Zend Framework 2 33

2.1 Begrifflichkeiten ...................................................................................................... 33

2.2 PHP-Version .............................................................................................................. 34

2.2.1 PHP-Namespaces ....................................................................................... 34

2.2.2 Closures ....................................................................................................... 36

2.2.3 Late Static Binding ..................................................................................... 38

2.3 Git und GitHub ......................................................................................................... 39

2.4 Neue Konzepte ........................................................................................................ 40

2.4.1 Verbesserte Modularität ........................................................................... 40

2.4.2 Dependency Injection ................................................................................ 41

2.4.3 Service-Locator ........................................................................................... 43

2.4.4 Ereignisgesteuerte Architektur ................................................................ 45

2.5 Komponentenvergleich ......................................................................................... 48

2.6 Vor- und Nachteile des ZF2 ................................................................................... 50

Page 4: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

6

3 Das Zend Framework einrichten 53

3.1 Voraussetzungen .................................................................................................... 53

3.1.1 PHP-Version ................................................................................................ 53

3.1.2 PHP-Extensions .......................................................................................... 54

3.1.3 Apache 2-Konfiguration ............................................................................ 57

3.1.4 Virtual Host einrichten unter Linux ......................................................... 57

3.1.5 Virtual Host einrichten unter Windows .................................................. 59

3.1.6 Weitere Informationen ............................................................................. 60

3.2 Zend Framework 2 installieren ............................................................................. 61

3.2.1 Installation aus einem ZIP-Paket .............................................................. 61

3.2.2 Installation mit Pyrus ................................................................................ 62

3.2.3 Installation mit Composer ........................................................................ 65

3.3 SkeletonApplication installieren ......................................................................... 68

3.3.1 Installation aus einem ZIP-Paket .............................................................. 69

3.3.2 Installation mit Git ..................................................................................... 69

3.3.3 Einrichtung mit Composer ........................................................................ 70

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

3.4.1 Hauptverzeichnis ....................................................................................... 71

3.4.2 Das Konfigurationsverzeichnis ................................................................. 73

3.4.3 Das Public-Verzeichnis .............................................................................. 74

3.4.4 Vendor-Verzeichnis .................................................................................... 76

3.4.5 Das Modulverzeichnis ............................................................................... 77

3.4.6 Kaskadierendes Laden der Konfigurationsdaten ................................... 82

3.4.7 Autoloading mit Composer ...................................................................... 83

TEIL II Die Komponenten

4 Basis-Komponenten 87

4.1 Zend\Loader ............................................................................................................. 87

4.1.1 StandardAutoloader .................................................................................. 88

4.1.2 ClassMapAutoloader ................................................................................. 88

4.1.3 AutoloaderFactory ..................................................................................... 89

4.1.4 Eigenen Autoloader erstellen ................................................................... 90

4.2 Zend\Config ............................................................................................................. 90

4.2.1 Konfigurationsdateien lesen .................................................................... 90

4.2.2 Konfigurationsdateien schreiben ............................................................ 91

Page 5: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

7

4.3 Zend\Cache .............................................................................................................. 92

4.3.1 Cache-Storages .......................................................................................... 92

4.3.2 Storage-Plugins und Capabilities ............................................................. 94

4.3.3 Cache-Patterns ........................................................................................... 95

4.4 Zend\Log ................................................................................................................... 96

4.4.1 Zusammenspiel der Teilkomponenten ................................................... 97

4.4.2 Writer .......................................................................................................... 98

4.4.3 Formatter .................................................................................................... 98

4.4.4 Filter ............................................................................................................. 98

4.5 Zend\Mail und Zend\Mime .................................................................................. 99

4.5.1 Eine E-Mail-Nachricht erstellen ................................................................ 100

4.5.2 Eine E-Mail-Nachricht versenden ............................................................. 100

4.5.3 MIME-Nachricht erstellen ......................................................................... 101

4.5.4 E-Mail-Nachrichten abrufen ..................................................................... 102

4.6 Zend\Filter ................................................................................................................ 103

4.6.1 Standardfilter ............................................................................................. 104

4.6.2 Statische Filter ............................................................................................ 106

4.6.3 Filterketten ................................................................................................. 107

4.6.4 Eigenen Filter erstellen .............................................................................. 107

4.7 Zend\Validator ........................................................................................................ 108

4.7.1 Standardvalidatoren .................................................................................. 109

4.7.2 Statische Validatoren ................................................................................ 111

4.7.3 Validatorketten .......................................................................................... 112

4.7.4 Eigenen Validator erstellen ....................................................................... 113

4.7.5 Validator-Fehlermeldungen anpassen .................................................... 115

5 Der Event-Manager 117

5.1 Einführung ................................................................................................................ 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

Page 6: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

8

6 Service Location & Dependency Injection 127

6.1 Zend\ServiceManager ............................................................................................ 127

6.1.1 Beispielklassen ........................................................................................... 128

6.1.2 Unterstützte Instanziierungsarten .......................................................... 130

6.1.3 Den Service-Manager konfigurieren ........................................................ 131

6.1.4 Konfigurationsklasse ................................................................................. 132

6.1.5 Konfigurationsdatei ................................................................................... 133

6.1.6 Initializer einrichten .................................................................................. 135

6.1.7 Abstrakte Fabrik verwenden ..................................................................... 137

6.1.8 Den Service-Manager richtig nutzen ....................................................... 140

6.2 Zend\Di ..................................................................................................................... 141

6.2.1 Automatische Erkennung mit »RuntimeDefinition« ............................. 141

6.2.2 Definition kompilieren mit »CompilerDefinition« ................................. 144

6.2.3 Abhängigkeiten konfigurieren ................................................................. 147

6.2.4 Zend\Di richtig nutzen .............................................................................. 150

7 Der Modul-Manager 151

7.1 Einführung ................................................................................................................ 151

7.2 Aufbau eines Moduls .............................................................................................. 152

7.2.1 Die Modul-Klasse ....................................................................................... 153

7.2.2 Das Konfigurationsverzeichnis ................................................................. 155

7.2.3 Assets im Public-Verzeichnis .................................................................... 155

7.2.4 Das Source-Verzeichnis ............................................................................. 156

7.2.5 Tests ............................................................................................................ 156

7.2.6 Das View-Verzeichnis ................................................................................ 157

7.3 Modulkonfiguration ............................................................................................... 157

7.3.1 Autoloading konfigurieren ....................................................................... 157

7.3.2 Konfigurationsdaten bereitstellen .......................................................... 158

7.3.3 Services konfigurieren ............................................................................... 161

7.3.4 Controller konfigurieren ........................................................................... 164

7.3.5 Controller-Plugins konfigurieren ............................................................. 166

7.3.6 View-Helper konfigurieren ....................................................................... 167

7.3.7 Weitere Konfigurationen .......................................................................... 169

7.4 Ein Anwendungsmodul entwickeln .................................................................... 169

7.4.1 Die Modul-Klasse ....................................................................................... 170

7.4.2 Modulkonfiguration .................................................................................. 171

Page 7: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

9

7.4.3 Controller und View-Script einrichten ..................................................... 173

7.4.4 Request-Parameter verwenden ............................................................... 175

7.5 Library-Modul erstellen ......................................................................................... 177

7.6 Fremdmodule installieren ..................................................................................... 179

7.6.1 Die ZendDeveloperTools mit Composer installieren ............................. 179

7.6.2 ZfcUser und ZfcBase mit Git klonen ........................................................ 181

8 MVC-Komponenten 183

8.1 Einführung ................................................................................................................ 183

8.2 Application ............................................................................................................... 184

8.2.1 Initialisierungsprozess ............................................................................... 184

8.2.2 Bootstrapping ............................................................................................. 186

8.2.3 Der Verarbeitungsprozess ......................................................................... 188

8.3 Services ...................................................................................................................... 189

8.4 Routing ...................................................................................................................... 192

8.4.1 Route-Typen ............................................................................................... 192

8.4.2 Der Route-Typ »Hostname« ...................................................................... 193

8.4.3 Der Route-Typ »Literal« ............................................................................. 194

8.4.4 Der Route-Typ »Regex« ............................................................................. 195

8.4.5 Der Route-Typ »Segment« ........................................................................ 196

8.4.6 SimpleRouteStack ...................................................................................... 197

8.4.7 TreeRouteStack .......................................................................................... 198

8.4.8 Routing konfigurieren ............................................................................... 201

8.4.9 Routing-Tipps ............................................................................................. 203

8.5 Events ........................................................................................................................ 205

8.5.1 Das »route«-Event für die Sprachfestlegung nutzen ............................. 205

8.5.2 Das »dispatch.error«-Event für das Logging nutzen .............................. 206

8.5.3 Das »finish«-Event für die Zeitmessung nutzen .................................... 209

8.6 Controller .................................................................................................................. 211

8.6.1 Einführung .................................................................................................. 211

8.6.2 Action-Controller ....................................................................................... 212

8.6.3 Zugriff auf Objekte .................................................................................... 214

8.6.4 Services injizieren ....................................................................................... 215

8.6.5 RESTful-Controller ...................................................................................... 218

8.7 Controller-Plugins ................................................................................................... 224

8.7.1 Zugriff auf Plugins ..................................................................................... 224

Page 8: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

10

8.7.2 Das »Layout«-Plugin .................................................................................. 225

8.7.3 Das »Url«-Plugin ........................................................................................ 225

8.7.4 Das »Redirect«-Plugin ................................................................................ 227

8.7.5 Das »Forward«-Plugin ............................................................................... 227

8.7.6 Das »Params«-Plugin ................................................................................. 229

8.7.7 Das »PostRedirectGet«-Plugin .................................................................. 229

8.7.8 Das »FilePostRedirectGet«-Plugin ............................................................ 231

8.7.9 Das »FlashMessenger«-Plugin .................................................................. 233

8.7.10 Ein eigenes Plugin erstellen ...................................................................... 234

9 View-Komponenten 237

9.1 Einführung in Zend\View ...................................................................................... 237

9.1.1 Bestandteile ................................................................................................ 237

9.1.2 Teilkomponenten ....................................................................................... 238

9.1.3 Konfiguration ............................................................................................. 240

9.2 ViewModels .............................................................................................................. 241

9.2.1 ViewModels verschachteln ....................................................................... 242

9.2.2 Weitere View-Models ................................................................................ 243

9.3 Resolver, Renderer und Strategies ...................................................................... 244

9.3.1 Resolver ....................................................................................................... 244

9.3.2 Renderer ...................................................................................................... 245

9.3.3 Strategies .................................................................................................... 245

9.4 View-Scripts .............................................................................................................. 247

9.5 View-Helper .............................................................................................................. 248

9.5.1 View-Helper für HTML-Kopfdaten ........................................................... 249

9.5.2 View-Helper für URLs ................................................................................. 250

9.5.3 View-Helper für das Escaping ................................................................... 250

9.5.4 Weitere View-Helper ................................................................................. 251

9.5.5 Einen eigenen View-Helper erstellen ...................................................... 253

9.6 Template-Engines ................................................................................................... 256

10 Datenbank-Komponenten 257

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

10.2 Datenbankadapter .................................................................................................. 258

Page 9: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

11

10.2.1 Konfiguration eines Adapters ................................................................... 258

10.2.2 Ausführen von lesenden Abfragen .......................................................... 260

10.2.3 Ausführen von schreibenden Abfragen .................................................. 261

10.2.4 ResultSet für Adapter konfigurieren ........................................................ 262

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

10.3.1 Lesende Abfragen generieren ................................................................... 265

10.3.2 Schreibende Abfragen generieren ........................................................... 268

10.3.3 Abfragen mit DDL generieren ................................................................... 270

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

10.4.1 Zend\Db\TableGateway ........................................................................... 271

10.4.2 TableGateway-Features ............................................................................ 274

10.4.3 Zend\Db\RowGateway ............................................................................. 278

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

10.5.1 Installation und Konfiguration ................................................................. 281

10.5.2 Modul und Entitäten vorbereiten ............................................................ 282

10.5.3 Doctrine 2 einsetzen .................................................................................. 286

11 Ausgabe-Komponenten 289

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

11.1.1 Translator .................................................................................................... 289

11.1.2 View-Helper ................................................................................................ 292

11.1.3 Fehlermeldungen für Zend\Validator übersetzen ................................. 294

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

11.2.1 Container und Seiten anlegen .................................................................. 295

11.2.2 Navigation konfigurieren .......................................................................... 297

11.2.3 Navigation ausgeben ................................................................................ 299

11.2.4 Navigation und ACL ................................................................................... 301

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

11.3.1 Adapter für Zend\Paginator ..................................................................... 303

11.3.2 Seitennavigation ........................................................................................ 305

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

11.4.1 Feeds lesen .................................................................................................. 309

11.4.2 Feeds schreiben .......................................................................................... 310

11.4.3 Feeds mit Zend\Mvc und Zend\View ...................................................... 311

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

11.5.1 Zend\Escaper .............................................................................................. 312

Page 10: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

12

11.5.2 Zend\Json ................................................................................................... 312

11.5.3 Zend\Tag ..................................................................................................... 313

11.5.4 Zend\Barcode ............................................................................................. 314

12 Formularverarbeitung 315

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

12.1.1 Ein InputFilter-Objekt erstellen ................................................................ 315

12.1.2 Factory mit Konfigurationsdaten nutzen ................................................ 317

12.1.3 InputFilter als eigenständige Klassen ...................................................... 318

12.1.4 Hierarchische InputFilter .......................................................................... 320

12.1.5 InputFilter im MVC .................................................................................... 322

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

12.2.1 Einführung .................................................................................................. 323

12.2.2 Ein Form-Objekt erstellen ......................................................................... 323

12.2.3 Fieldsets ...................................................................................................... 325

12.2.4 Collections .................................................................................................. 328

12.2.5 Elemente ..................................................................................................... 331

12.2.6 Ausgabe mit View-Helpern ....................................................................... 333

12.2.7 Validierung von Formularen ..................................................................... 337

12.2.8 Objekte anbinden ...................................................................................... 340

12.2.9 Annotationen ............................................................................................. 343

12.2.10 Datei-Uploads ............................................................................................ 346

13 Benutzermanagement 351

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

13.1.1 Mit Session-Containern arbeiten ............................................................. 351

13.1.2 Session-Manager verwenden ................................................................... 352

13.1.3 Sessions in der Datenbank speichern ...................................................... 353

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

13.2.1 Begrifflichkeiten ......................................................................................... 355

13.2.2 ACL definieren ............................................................................................ 355

13.2.3 ACL abfragen .............................................................................................. 357

13.2.4 ACL cachen .................................................................................................. 357

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

13.3.1 Begrifflichkeiten ......................................................................................... 358

Page 11: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

13

13.3.2 RBAC definieren ......................................................................................... 359

13.3.3 RBAC abfragen ............................................................................................ 360

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

13.4.1 Per HTTP authentifizieren ......................................................................... 361

13.4.2 Gegen eine Datenbanktabelle authentifizieren ..................................... 363

13.4.3 Authentifizierungsservice ......................................................................... 365

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

14 Sonstige Komponenten 369

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

14.1.1 HTTP-Anfrage senden und verarbeiten ................................................... 369

14.1.2 Verbindungsadapter .................................................................................. 370

14.1.3 Fortgeschrittener Einsatz .......................................................................... 370

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

14.2.1 SOAP-Server bereitstellen ......................................................................... 371

14.2.2 SOAP-Client einsetzen ............................................................................... 373

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

14.3.1 XML-RPC-Server bereitstellen ................................................................... 374

14.3.2 XML-RPC-Client einsetzen ......................................................................... 375

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

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

TEIL III Die Module

15 Das Anwendungsmodul 383

15.1 Anforderungen ........................................................................................................ 383

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

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

15.3.1 Der View-Helper »PageTitle« .................................................................... 388

15.3.2 Der View-Helper »ShowMessages« ......................................................... 389

15.3.3 Der View-Helper »ShowForm« ................................................................. 391

15.3.4 Der View-Helper »Date« ............................................................................ 393

Page 12: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

14

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

15.9.1 Der »StringToUrl«-Filter .......................................................................... 404

15.9.2 Der »StringHtmlPurifier«-Filter .............................................................. 406

15.9.3 Konfiguration für beide Filter ................................................................. 407

15.10 CKEditor ................................................................................................................... 409

16 Das Blog-Modul 411

16.1 Anforderungen ........................................................................................................ 411

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

16.3 Modelinfrastruktur ................................................................................................. 419

16.3.1 Datenbank einrichten ................................................................................ 419

16.3.2 Klassen erstellen ........................................................................................ 421

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

16.4.1 Filter und Validierung ................................................................................ 426

16.4.2 Formularklasse ........................................................................................... 427

16.4.3 Factories ...................................................................................................... 429

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

16.5.1 Formular-Objekte injizieren ...................................................................... 432

16.5.2 Der Blog-Service – Überblick ..................................................................... 433

16.6 Öffentlicher Bereich ................................................................................................ 440

16.6.1 Action-Controller einrichten ..................................................................... 440

16.6.2 View-Scripts einrichten ............................................................................. 443

16.7 Administrationsbereich ......................................................................................... 444

16.7.1 Action-Controller einrichten ..................................................................... 445

16.7.2 View-Scripts einrichten ............................................................................. 447

16.8 Optimierungen ........................................................................................................ 451

Page 13: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

15

17 Das Benutzer-Modul 453

17.1 Anforderungen ........................................................................................................ 453

17.2 Vorbereitungen ....................................................................................................... 454

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

17.3.1 Authentifizierungsadapter ....................................................................... 456

17.3.2 Authentifizierungsservice ......................................................................... 460

17.3.3 Autorisierungsservice ................................................................................ 461

17.3.4 Konfiguration der Benutzerrechte ........................................................... 464

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

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

17.5.1 Der View-Helper »UserIsAllowed« ........................................................... 470

17.5.2 Der View-Helper »UserShowWidget« ..................................................... 471

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

17.7 Öffentlicher Bereich ................................................................................................ 478

17.7.1 Den Action-Controller einrichten ............................................................. 478

17.7.2 View-Scripts einrichten ............................................................................. 481

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

Page 14: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

16

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

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

19.4.1 Der View-Helper »CommentShowLinks« ................................................ 511

19.4.2 Der View-Helper »CommentShowComments« ..................................... 513

19.4.3 Einsatz der View-Helper ............................................................................ 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 .................................................... 535

20.8.1 Konfiguration anpassen ............................................................................ 536

20.8.2 Entität anpassen ........................................................................................ 537

20.8.3 Den Kommentar-Service anpassen .......................................................... 537

20.8.4 Action-Controller anpassen ...................................................................... 539

20.8.5 View-Scripts anpassen .............................................................................. 542

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

21 Das CMS-Modul 549

21.1 Anforderungen ........................................................................................................ 549

21.2 Vorbereitungen ....................................................................................................... 550

21.2.1 Konfiguration ............................................................................................. 551

21.2.2 CMS-Service ................................................................................................ 552

21.2.3 Textblöcke ................................................................................................... 553

21.2.4 View-Helper zur Ausgabe von Textblöcken ............................................ 553

Page 15: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

17

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

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

21.5 View-Helper für 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

A Installation der Projektdateien ............................................................................ 601

A.1 ZIP-Pakete downloaden ......................................................................... 601

A.2 Dateien von GitHub klonen ................................................................... 602

A.3 Installation ohne Composer .................................................................. 602

A.4 Virtual Host anpassen ............................................................................. 603

B Weitere Komponenten .......................................................................................... 605

C Performance-Tipps .................................................................................................. 607

C.1 Autoloader ClassMap .............................................................................. 607

Page 16: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Inhalt

18

C.2 TemplateMap ............................................................................................ 607

C.3 Die Modul-Konfiguration cachen ......................................................... 608

C.4 Weitere Caches ......................................................................................... 608

Index ........................................................................................................................................................ 611

Page 17: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

33

2

Kapitel 2

Neuerungen im Zend Framework 2

Viele Umsteiger vom Zend Framework 1 sind besonders an den Neuerungen interes-

siert, die das Zend Framework 2 mit sich bringt. Für Umsteiger hat sich im ZF2 einiges

geändert, sodass sie sich auf einen erneuten Lernaufwand einstellen müssen. Diese

Hürde sollte jedoch niemanden abschrecken. Wer sich einmal in die neuen Konzepte

und Komponenten eingearbeitet hat, der wird sie zukünftig nicht mehr missen wol-

len. Die größten Probleme treten am ehesten auf, wenn eine viel genutzte ZF1-Kom-

ponente im ZF2 nicht mehr zum Framework-Kern gehört. In solch einem Fall können

Sie bei Bedarf zumindest übergangsweise immer noch die ZF1-Komponenten ver-

wenden.

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 häufig gebraucht, auch

wenn diese im ZF1 für den Anwender nicht ganz so allgegenwärtig waren, wie sie es

im ZF2 sind.

Interfaces wurden bereits im ZF1 an vielen Stellen eingesetzt. Wenn Sie das ZF2 ein-

setzen, kommen Sie damit häufiger in Berührung. Ein Interface gibt vor, welche

Methoden mit welchen Parametern in einer Klasse vorhanden sein müssen, wenn

diese Klasse das Interface implementiert. Für Klassen, die von anderen Klassen ver-

wendet werden, wird empfohlen, ein Interface als Basis zu erschaffen und dieses

auch in den Methodensignaturen zu verwenden. Es heißt also nicht:

function bakePizza(Pizza $pizza)

sondern:

Page 18: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

34

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 benötigt. Factories können als Klassen, Methoden

oder Closures implementiert sein.

In einer Modelinfrastruktur kann es verschiedene Bestandteile geben. Eine Entität

stellt dabei ein einfaches Objekt, wie z. B. eine Pizza, ein Buch oder einen Blogbeitrag

dar. Eine Datenquelle ist dafür zuständig, die Daten für eine Entität aus einer Daten-

bank oder einer anderen Datenquelle zu lesen. Um die Daten aus einer Datenquelle

an eine Entität 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 hält alles zusammen. Er kommuniziert mit Datenquellen und

Mappern, verarbeitet Entitäten, setzt Hydratoren ein und stellt eine Schnittstelle

bereit, damit Controller auf die Modelinfrastruktur zugreifen können.

2.2 PHP-Version

Die augenscheinlichste Neuerung ist der Wechsel auf PHP 5.3 als Mindestanforde-

rung für 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 wer-

den. Der Zend Framework 2-Nutzer kommt am ehesten mit dem Einsatz von

Namensräumen und der Verwendung von Closures in Berührung. Das Zend Frame-

work 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 Namensräume unterstützt. Deshalb wurden im Zend Frame-

work 1 künstliche Namensräume geschaffen, um die Klassen auf die Dateiebene

abbilden zu können. Ein Beispiel: Die Klasse Zend_Loader_Autoloader ist im Zend

Framework 1 in der Datei /library/Zend/Loader/Autoloader.php abgelegt. Durch

diese künstlichen Namensräume wird sichergestellt, dass es nicht zu Namenskollisi-

onen mit anderen Autoloader-Klassen aus anderen Bibliotheken kommt.

PHP 5.3 bietet echte Namensräume, sodass im Zend Framework 2 das Abbilden von

Klassen auf Dateiebene vereinfacht wird. Die neue Klasse StandardAutoloader gehört

Page 19: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.2 PHP-Version

35

2

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 dürfen im /library/Zend/-Verzeichnis keine Dateien liegen. Die äquiva-

lente Klasse Config gehört 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

Schlüsselwort namespace der Namensraum definiert, zu dem die Klasse gehört. Mit-

hilfe des Schlüsselwortes use werden andere Namensräume importiert, damit Klas-

sen und Interfaces aus diesen Namensräumen in unserer Klasse verwendet werden

können. Bei den Namensräumen ArrayAccess, Countable und Iterator handelt es

sich übrigens um Namensräume, 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 für die Config-Klasse

Die Verwendung der Namensräume ist jedoch nicht auf die Zend Framework 2-Biblio-

thek beschränkt. Auch in den Klassen und Anwendungsmodulen können und sollten

Entwickler Namensräume definieren (zum Thema Modularität siehe Abschnitt 2.4.1,

»Verbesserte Modularität«).

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 Namensräume, von denen zwei zur Zend Framework 2-Bibliothek

gehören und die beiden anderen zu einem Blog-Modul. Mithilfe des Schlüsselworts

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 könnte.

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

Page 20: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

36

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 für einen Action-Controller

ZF1-Umsteiger und ZF2-Einsteiger werden gleichermaßen die Vorteile der Namens-

räume schnell zu schätzen 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 könnte.

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 Vari-

able $pizzaPrice, die als Funktion verwendet werden kann.

$pizzaPrice = function($items) {return 3.95 + $items * 0.95;

};

echo $pizzaPrice(3); // output 6.8echo $pizzaPrice(7); // output 10.6

Listing 2.3 Beispiel für eine einfache Closure-Definition

Eine Closure kann aber beim Aufruf nicht nur variable Parameter übergeben bekom-

men. Es ist auch möglich, bei der Definition Variablen mithilfe des Schlüsselwortes

use zu übergeben, die dann als fixe Werte verwendet werden können. Listing 2.4 zeigt

das geänderte Beispiel, bei dem die Werte für 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;

Page 21: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.2 PHP-Version

37

2

};

echo $pizzaPrice(2); // output 5.85echo $pizzaPrice(6); // output 9.65

Listing 2.4 Beispiel für eine Closure-Definition mit übergebenen Variablen

Closures können aber nicht nur an Variablen übergeben werden, sondern auch als

Parameter an andere Funktionen oder Klassenmethoden übergeben werden. In Lis-

ting 2.5 werden zuerst einige Pizza-Klassen definiert sowie eine Sammlung von Pizza-

Objekten erstellt. Um nur die Salami-Pizzen auszufiltern, wird das Objekt $pizzaList

an die array_filter()-Methode übergeben. Zudem wird eine Closure als Callback-

Funktion übergeben, die true zurückgibt, wenn der Wert eine Instanz von Pizza-

Salami 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 für eine Closure-Definition als Parameter einer Funktion

Somit können wir Closures auch für alle PHP-Funktionen verwenden, die eine Call-

back-Funktion als Parameter erwarten. Neben der verwendeten array_filter()-

Funktion wären das z. B. auch call_user_func() oder usort().

Zend Framework 2-Nutzer verwenden Closures am ehesten bei der Definition von

Factories für den Service-Manager (siehe Abschnitt 6.1, »Zend\ServiceManager«).

Page 22: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

38

2.2.3 Late Static Binding

Die Methodik das Late Static Binding (»späte statische Bindung«) löst 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 Schlüsselwort self auf die Methode name() zu, während

die Methode getNameStatic() das Schlüsselwort static verwendet. Die Klasse Pizza-

SalamiPeperoni erweitert die Klasse PizzaSalami und überschreibt die Methode

name(). Der Unterschied in der Funktionsweise tritt beim Aufruf der Methode Pizza-

SalamiPeperoni::getNameStatic() am Ende des Listings auf. Dort wird nämlich der

richtige Name der PizzaSalamiPeperoni ausgegeben. Dieses Verhalten war in PHP 5.2

nicht möglich 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 für Late Static Binding

Die Methodik des Late Static Binding wird in der Zend Framework 2-Bibliothek recht

häufig verwendet. Als Nutzer des Zend Framework 2 kommen Sie damit nur in

Berührung, wenn Sie es in ihren eigenen Klassen verwenden möchten.

Page 23: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.3 Git und GitHub

39

2

2.3 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 für die Versionsverwaltung von Dateien. Das Zend Framework 1 hat von

Beginn an auf SVN gesetzt. Für das Zend Framework 2 wurde frühzeitig entschieden,

sich die Vorteile von Git für die Entwicklung des ZF2 zunutze zu machen. Doch wieso

kam es dazu?

Das Zend-Framework-Team versprach sich von dem Wechsel eine verbesserte Pro-

duktivität, sodass Patches und Verbesserungsvorschläge der Framework-Anwender

schneller eingepflegt werden können. Die Erfahrung der letzten Jahre in der Entwick-

lung vom Zend Framework 2 hat diese Hoffnung mehr als bestätigt. Mittlerweile ist

auch der Issue Tracker, in dem Anwender Bugs und Feature Requests einstellen kön-

nen, auch zu GitHub gewechselt. Somit liegen die wichtigsten Entwicklungstools nun

auf einer Plattform und sind nicht über mehrere Tools verteilt.

Git gibt es für alle wichtigen Betriebssysteme wie Linux, Windows und Mac OS X

(http://git-scm.com/). Wenn Sie eine Anwendung mit dem Zend Framework erstel-

len möchten, müssen Sie für Ihre Versionsverwaltung nicht unbedingt auch zu Git

wechseln. Es ist aber dennoch hilfreich, wenn auf Ihrem Entwicklungsrechner auch

Git zur Verfügung steht, da dies die Installationen der SkeletonApplication (siehe

Abschnitt 3.3, »SkeletonApplication installieren«) sowie von Fremdmodulen verein-

fachen kann.

Bei GitHub handelt es sich um einen webbasierten Hosting-Dienst für Softwarepro-

jekte (https://github.com/). Dort kann jeder Entwickler eigene öffentliche Reposito-

ries für seine Softwareprojekte anlegen und pflegen oder bestehende kopieren, um

sie an eigene Bedürfnisse 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 fin-

den; als Beispiel seien die Module der ZF-Commons-Initiative genannt (siehe https://

github.com/ZF-Commons).

Wer sich mit Git und GitHub noch nicht auskennt, der braucht keine Angst zu haben,

außer mit dem neuen Zend Framework 2 auch noch Stunden mit dem Lernen von Git

und GitHub verbringen zu müssen. Mit folgenden Links gelingt der Einstieg auch

Anfängern:

� http://try.github.com/

Ein schön gemachtes, interaktives Tutorial für den allgemeinen Einstieg in Git und

GitHub

Page 24: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

40

� 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

für fortgeschrittene Themen.

Im weiteren Verlauf des Buches werden wir bei der Installation der SkeletonApplica-

tion und bei Fremdmodulen sowie beim Einrichten eigener Repositories auf die

grundlegenden Befehle und Funktionen von Git näher 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 länger in der Softwareentwicklung eingesetzt. Neu ist der Einsatz im ZF2.

Mithilfe dieser Konzepte wurde die Entwicklung von Zend Framework 2-Anwendun-

gen noch einmal um ein Vielfaches vereinfacht. Einsteiger und Umsteiger müssen

diese Lernkurve jedoch erst einmal erklimmen. Sobald Sie aber die Konzepte verstan-

den und verinnerlicht haben, werden Sie diese in Zukunft nicht mehr missen wollen.

Die Konzepte werden in diesem Abschnitt unabhängig vom Zend Framework 2 erläu-

tert. Auf die konkreten Zend Framework 2-Implementierungen wird entsprechend

verwiesen.

2.4.1 Verbesserte Modularität

Im Zend Framework 1 gab es bereits Module. Doch diese waren eher Bürger zweiter

Klasse (»second-class citizens«). Die Konfiguration der Module war mühsam, und ein

Austausch von Modulen zwischen mehreren Anwendungen war aufgrund von

Abhängigkeiten nicht ohne Weiteres möglich. Im Wesentlichen waren Module im

ZF1 nur Container für Action-Controller, View-Scripts und für weitere Klassen des

Moduls.

Im Zend Framework 2 sind die Module nun Bürger 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 kon-

figuriert werden kann. Dies bringt viele Freiheiten, bedeutet aber auch einen gewis-

sen Aufwand bei der Einrichtung einer neuen Zend Framework 2-Anwendung.

Page 25: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.4 Neue Konzepte

41

2

Somit kann eine Zend Framework 2-Anwendung verschiedene Anwendungsmodule

wie ein Blog, einen Shop oder ein Kommentarmodul einsetzen. Und Sie können diese

Module in der Regel mit vertretbarem Aufwand in anderen Zend Framework 2-

Anwendungen ebenfalls einsetzen.

Zusätzlich gibt es eine Vielzahl an ZF2-Fremdmodulen, die Sie in Ihre Projekte inte-

grieren können. Diese Module bieten Benutzermanagement, Doctrine 2-Integration,

Twitter Bootstrap-Unterstützung, Asset-Management und vieles mehr.

In Kapitel 7, »Der Modul-Manager«, wird die Implementation der neuen Modularität

detailliert erläutert. Auch die Entwicklung von Anwendungsmodulen und die Instal-

lation von Fremdmodulen werden anhand praktischer Beispiele beleuchtet.

2.4.2 Dependency Injection

Der Begriff der Dependency Injection definiert ein Entwurfsmuster, das die Steue-

rung der Abhängigkeiten zwischen Objekten löst. Ohne Dependency Injection wer-

den Abhängigkeiten von Objekten meistens hart codiert in den Code aufgenommen.

Listing 2.7 demonstriert ein Beispiel mit festen Abhängigkeiten. Diese Pizza Salami

wird mit den drei festen Belägen Salami, Käse und Tomatenpampe belegt, und der

Pizzaboden ist aus Weizenmehl gemacht. Möchte ein Kunde nun doppelt Käse, Elch-

salami oder einen Pizzaboden aus Dinkelmehl, kann Luigi diese Wünsche 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 für eine Pizza Salami mit festen Belägen und Pizzaboden

Page 26: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

42

Die Lösung für das Problem der hart codierten Abhängigkeiten 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 Beläge in einem Array an den Konstruktor zu übergeben, wurde eine eigene

Methode addTopping() implementiert. Diese Methode nimmt einen Parameter ent-

gegen, der das ToppingInterface implementieren muss. Somit können wir nicht nur

die Beläge selber, sondern auch die Anzahl der Beläge bequem variieren. Am Ende

des Listings wird unsere Pizza Salami instanziiert. Dabei wird unser Pizzaboden aus

Weizenmehl übergeben, und danach werden die Beläge hinzugefügt. Auch die Spezi-

alpizza mit Elchsalami, doppelt Käse 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 CrustWheatFlour());$pizzaSalami->addTopping(new ToppingSalami());$pizzaSalami->addTopping(new ToppingCheese());$pizzaSalami->addTopping(new ToppingTomatoStodge());

$pizzaSpeciale = new Pizza(new CrustSpeltFlour());$pizzaSpeciale->addTopping(new ToppingElkSalami());$pizzaSpeciale->addTopping(new ToppingCheese());$pizzaSpeciale->addTopping(new ToppingCheese());$pizzaSpeciale->addTopping(new ToppingTomatoStodge());

Listing 2.8 Klasse für Pizza mit variablen Belägen und variablem Pizzaboden

Diese Vorgehensweise ist nicht nur beim Belegen von Pizzen hilfreich. Auch das Tes-

ten der Anwendung wird dadurch stark vereinfacht. Denn solange unsere Beläge das

Interface ToppingInterface implementieren, können wir diese Klasse auch mit Mock-

Objekten (Dummy-Objekten oder Attrappen) befüllen. Solange Luigi am Ende keine

Page 27: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.4 Neue Konzepte

43

2

Pizza mit Gel-Schinken und Kunst-Käse ausliefert, kann das Mocken der Beläge beim

Testen durchaus akzeptabel und sinnvoll sein.

In Abschnitt 6.2, »Zend\Di«, wird die Zend Framework 2-Implementation des Ent-

wurfsmusters Dependency Injection ausführlich 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 können. Das Zend

Framework 2 stellt aber etwas viel Besseres bereit: den Service-Locator. Beim Service-

Locator handelt es sich auch um ein Entwurfsmuster für eine zentrale Registrierung

von Objekten zur späteren Nutzung. Es funktioniert ähnlich wie die Registry, nur

dass sich der Service-Locator auch um die Instanziierung der Objekte kümmert.

In Listing 2.9 wird das Prinzip des Service-Locators mit einer eigenen Implementa-

tion dargestellt. Die Klasse ServiceLocator verfügt über drei Methoden zum Initiali-

sieren, Hinzufügen und Holen von Services. Die Methode set() nimmt einen

Bezeichner und den Namen der Klasse entgegen, instanziiert die Klasse und legt sie

für den späteren Zugriff ab. Die Methode get() gibt mithilfe des Bezeichners die

Instanz zurück. Unter der Klassendeklaration wird der ServiceLocator zuerst mit den

notwendigen Services gefüttert. Am Ende des Listings wird unsere Salamipizza mit

Pizzaboden und Belägen 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');

Page 28: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

44

$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 erwähnt wurde, ist dieses Beispiel funktional stark reduziert, und der Mehr-

aufwand mag auf den ersten Blick zu viel des Guten sein. Dies liegt vor allem daran,

dass die Services, die wir ablegen, nur einfache Objekte ohne Methoden sind. Denken

Sie statt an Käse und Salami einmal an komplexere Services für Authentifizierung,

Mailversand oder Logging. Diese Objekte werden wiederum andere Objekte für die

Instanziierung benötigen, die wiederum andere Objekte benötigen. Statt eines einfa-

chen Klassennamens kann ein Service-Locator (wie im nächsten Beispiel zu sehen)

auch eine Closure übergeben bekommen, die sich um die Instanziierung der Objekte

kümmert.

Listing 2.10 zeigt den geänderten Service-Locator, an dem nur die set()-Methode ver-

ändert wurde. Statt eines Strings nimmt sie nun eine Instanz des Closure-Objekts

entgegen. Der Service wird angelegt, indem die Closure ausgeführt wird. Weiter

unten wird die Closure-Methode definiert und an die Variable $factoryClosure über-

geben. 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 ausgeführt. Zum Abschluss wird die Instanz vom Service-Locator angefor-

dert und ausgegeben. Wir erhalten dabei eine Instanz von Pizza mit Salami, Käse und

Tomatenpampe zurück.

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

}

Page 29: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.4 Neue Konzepte

45

2

}

$factoryClosure = function() {$pizzaSalami = new Pizza(new CrustWheatFlour());$pizzaSalami->addTopping(new ToppingSalami());$pizzaSalami->addTopping(new ToppingCheese());$pizzaSalami->addTopping(new ToppingTomatoStodge());return $pizzaSalami;

};

$sl = new ServiceLocator();$sl->set('pizza-salami', $factoryClosure);

var_dump($sl->get('pizza-salami'));

Listing 2.10 Implementation eines Service-Locators mit Closures

Ein Service-Locator könnte neben Klassennamen und Closures auch andere Parame-

ter für die Instanziierung der Objekte verarbeiten, was die Flexbilität und die Testbar-

keit erhöhen würde. So wären Factory-Klassen denkbar, deren Aufgabe es ist, ein

Objekt einer Klasse zu instanziieren und zurückzuliefern.

In Abschnitt 6.1, »Zend\ServiceManager«, wird die Zend Framework 2-Implementa-

tion des Service-Locator-Entwurfsmusters und deren Konfiguration mit Beispielen

erläutert.

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.

Für eine beispielhafte Implementation benötigen wir einen Event-Manager, der auch

als Event-Dispatcher bezeichnet wird. Dessen Aufgabe ist es, eine Reihe von Event-

Listenern zu verwalten. Diese Listener warten darauf, dass ein Ereignis angestoßen

wird (to trigger an event). Wird das Ereignis angestoßen, so können die Aufgaben

ausgeführt werden.

Für unser nächstes Beispiel stellen wir uns den Eingang einer Pizzabestellung vor.

Sobald die neue Bestellung gespeichert wird, muss eine Reihe von Aufgaben erledigt

werden. Diese Aufgaben könnten der Versand einer Bestellbestätigung, die Aktuali-

sierung des Warenbestands und das Backen der Pizza sein. Vor dem Speichern der

Bestellung könnte zudem der Warenbestand geprüft werden.

Page 30: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

46

Listing 2.11 zeigt ein kompaktes Beispiel für 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().

Zusätzlich benötigen wir noch eine Klasse für die Bestellung der Pizza. Den Kern stellt

die Klasse EventManager dar. Mithilfe der Methode attach() können die definierten

Listener für ein entsprechendes Ereignis hinzugefügt werden. Zudem steht die

Methode trigger() bereit, um die Ereignisse bei den registrierten Listenern ausfüh-

ren zu lassen.

interface EventListener {}

class SendConfirmation implements EventListener {public function postOrder(){echo "Send order confirmation";

}}class UpdateStock implements EventListener {public function postOrder(){echo "Update stock";

}}class BakePizza implements EventListener {public function postOrder(){echo "Bake the pizza";

}}class CheckStock implements EventListener {public function preOrder(){echo "Check stock";

}}

class PizzaOrder{public function __construct(){echo "Save order";

}

Page 31: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.4 Neue Konzepte

47

2

}

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 für einen Event-Manager

Danach wird der Event-Manager instanziiert, und die Listener werden für die Ereig-

nisse hinzugefügt. Entscheidend für die Ausführung eines Listeners ist die Reihen-

folge, in der die Listener hinzugefügt wurden. Danach kann es endlich losgehen.

Zuerst wird das Ereignis preOrder ausgelöst, danach wird die Bestellung erstellt und

zum Schluss das Ereignis postOrder ausgelöst. Die Ausgabe erfolgt in dieser Reihen-

folge:

Check stockSave orderSend order confirmationBake the pizzaUpdate stock

Page 32: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

48

Natürlich ist dieser Event-Manager recht primitiv. Listener müssten auch entfernt

werden können. Zudem wäre eine frei definierbare Reihenfolge für die Ausführung

der Listener beim Auslösen eines Ereignisses sinnvoll. Wir könnten weitere Inter-

faces erstellen, die das Vorhandensein von preOrder()- und postOrder()-Methoden

vorschreiben. Außerdem sollte nach einer fehlerhaften Prüfung 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 ausführlich dargelegt und mit Beispielen versehen. Übrigens wurde

der Event-Manager mittlerweile auch in das Zend Framework 1.12 zurückportiert.

2.5 Komponentenvergleich

Der Großteil der Komponenten, die es bereits im Zend Framework 1 gegeben hat, fin-

det sich auch weiterhin im Zend Framework 2 wieder. Manche Komponenten wur-

den nur leicht überarbeitet, andere wiederum von Grund auf neu entwickelt; wieder

andere fielen ganz weg oder gehören 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_Con-

troller wurde Zend\Mvc. Die Komponente Zend_Acl wurde nach Zend\Permissions\

Acl verschoben. Wenn Sie bisher diese Komponenten reichlich genutzt haben, kön-

nen Sie auch weiterhin darauf bauen, auch wenn sich die Benutzung dieser Kompo-

nenten zum Teil gravierend geändert 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)

Page 33: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.5 Komponentenvergleich

49

2

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 für die Internationalisierung (»i18n«) und

Lokalisierung (»l10n«) von Webanwendungen. Da PHP 5.3 jedoch eigene Funktiona-

litäten für die Internationalisierung und Lokalisierung bietet, konnten diese Kompo-

nenten stark reduziert werden. Das Ergebnis ist die Komponente Zend\I18n, die

weiterhin einen Translator sowie Filter und Validatoren für die Internationalisierung

und Lokalisierung bereitstellt.

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 erwähnt in der neuen Komponente Zend\I18n zusammengefasst.

Für die Komponenten mit einem »(GH)« wurden auf GitHub eigene Repositories

eingerichtet (https://github.com/zendframework). Die ZF-Community ist dazu auf-

gerufen, sich dieser Komponenten anzunehmen und sie zukünftig weiterzuentwi-

ckeln. Das Zend Framework-Kernteam kann diese Arbeit zukünftig nicht mehr über-

nehmen.

Zend\Dom Zend\Mvc Zend\Version

Zend\Feed Zend\Navigation Zend\View

Zend\Filter Zend\Paginator Zend\XmlRpc

Zend\Form Zend\Permissions\Acl

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)

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)

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

Page 34: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

50

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

der Anfangszeit großes 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-Gründen

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 gehören. Auch die Webservice-Kompo-

nenten aus Zend_Service gehören nicht mehr zum Kern vom ZF2.

Das gleiche Schicksal teilen die beiden Komponenten Zend_Dojo und ZendX_JQuery,

die Unterstützung für JavaScript-Bibliotheken geboten haben (wobei speziell ZendX_

JQuery nie zum Kern des Zend Framework 1 gezählt hat). Wer Unterstützung für Dojo

und jQuery sucht, wird zukünftig auf spezielle Fremdmodule hoffen müssen.

Die Fokussierung auf weniger Kernkomponenten ist ein großes Plus für das Zend

Framework 2. Dadurch werden die Kapazitäten besser auf die wesentlichen Kompo-

nenten konzentriert und das Problem mit Komponenten, die nicht oder nur kaum

gepflegt werden, hat sich damit auch gelöst.

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:

� Ein wichtiges Feature des Zend Framework 2 ist die neue Modularität, die den Aus-

tausch von Modulen zwischen Anwendungen sowie die Konfiguration der

Module stark vereinfacht. Zudem gibt es bereits ein großes Angebot an wiederver-

wendbaren Fremdmodulen, und nahezu täglich kommen mehr dazu. Diese frem-

den Module lassen sich in der Regel leicht installieren und bei Bedarf auch

anpassen.

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

Page 35: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2.6 Vor- und Nachteile des ZF2

51

2

� Das Zend Framework 1 bot ein hohes Maß an Flexibilität. Mit dem Zend Frame-

work 2 konnten diese Freiheiten nochmals erweitert werden. Gab es im ZF1 festge-

legte Konventionen, an die Sie sich halten mussten, damit Ihre Anwendung

problemlos lief, so können Sie im ZF2 viele Funktionalitäten 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 lässt sich so weit aufbohren, dass

Sie den gesamten Prozess der Model-View-Controller-Verarbeitung umgestalten

können.

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

entfalten ihr großes Potenzial, sobald Sie diese verinnerlicht haben und täglich

anwenden. Wenn Sie die Lernkurve erst einmal erklommen haben, werden Sie

ungern zum Zend Framework 1 zurückkehren wollen.

� Neu beim ZF2 ist auch die Möglichkeit, nur die Komponenten zu installieren, die

Sie brauchen. Sie sind nicht gezwungen, das gesamte Framework herunterzula-

den. Für 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

für Ihre Anwendung zu nutzen. Sie können das Zend Framework somit als Glue

Framework einsetzen. Auf der anderen Seite können 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 Kom-

ponente wird für den Kern akzeptiert, wenn die Funktionalitäten nicht mit ausrei-

chend 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 (Contri-

butor License Agreement) unterzeichnen und an die Firma Zend faxen. Diese

Hürde fällt 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 große Hürde darstellen. Diese sollen nicht ver-

schwiegen werden, auch wenn sie mit wachsender Erfahrung keine Hindernisse

mehr darstellen werden.

� Die Konfigurationslastigkeit kann auf den ersten Blick abschrecken. Da es für viele

Dinge keine festen Konventionen mehr gibt, müssen Sie diese selber konfigurie-

ren. Die SkeletonApplication, die Sie in Abschnitt 3.3, »SkeletonApplication instal-

Page 36: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

2 Neuerungen im Zend Framework 2

52

lieren«, kennenlernen werden, nimmt Ihnen zwar einiges an Arbeit ab. Dennoch

müssen Sie für Ihre Anwendungsmodule die Routen, die Controller, eigene View

Helper und Plugins, das Autoloading und vieles mehr konfigurieren.

� Die zusätzliche Flexibilität, die das Zend Framework 2 bietet, hat natürlich auch

eine höhere Komplexität zu Folge. Wer seit einigen Jahren mit dem Zend Frame-

work 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 aus-

kennen, ist das ein großes Plus für den Einstieg ins ZF2.

� Außer mit dem Zend Framework 2 an sich muss der Entwickler sich auch noch mit

Tools wie Git, Pyrus und Composer auseinandersetzen.

Page 37: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

351

13

Kapitel 13

Benutzermanagement

Eine moderne Webanwendung lebt von der Interaktion ihrer Nutzer. Doch selbst

eine Website, die nicht mit dem Besucher interagieren möchte, muss von Redakteu-

ren gepflegt werden. Für das Benutzermanagement stellt das ZF2 mehrere Kompo-

nenten bereit. Dazu zählen 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 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 Funktio-

nen für die Sessionverarbeitung und die Möglichkeit, Sessions in einer Datenbank zu

schreiben (siehe https://zf2.readthedocs.org/en/latest/modules/zend.session.intro-

duction.html).

13.1.1 Mit Session-Containern arbeiten

Um mit einem Container zu arbeiten, erstellen Sie eine Zend\Session\Container-

Instanz und übergeben die zu speichernden Daten. Beim nächsten Seitenaufruf kön-

nen Sie darauf zugreifen (siehe Listing 13.1). Bei der Instanziierung eines Container-

Objekts übergeben Sie einen Bezeichner, um die gespeicherten Daten identifizieren

zu können. Dem Objekt können Sie Daten zuweisen, indem Sie einen Bezeichner mit

Werten belegen. Im ersten Beispiel wird bei jedem Seitenaufruf ein Zähler um 1

erhöht.

use Zend\Debug\Debug;use Zend\Math\Rand;use Zend\Session\Container;

$counter = new Container('counter');$counter->number = $counter->number + 1;

Page 38: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

352

$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>Zähler</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 offset-

Exists() prüfen Sie, ob ein Bezeichner mit einem Wert belegt ist. Mit offsetGet()

holen Sie sich den aktuellen Wert aus der Session. Mit offsetSet() können Sie den

Bezeichner mit einem Wert belegen. Die Werte für die beiden Bezeichner werden aus-

gegeben; dabei wird hochgezählt, und der Warenkorb wird immer voller.

Um die Speicherung der Daten in der Session müssen Sie sich nicht selber kümmern.

Diese Aufgabe übernimmt Zend\Session\Container für Sie.

13.1.2 Session-Manager verwenden

Mit dem Session-Manager können Sie die Konfiguration ändern, Sessions starten

und beenden, die Cookie-Lebenszeit ändern, die Session-ID erneuern usw. Das Con-

tainer-Objekt ermöglicht mit getManager() den Zugriff auf den Session-Manager:

use Zend\Session\Container;

$container = new Container('pizza');$sessionManager = $container->getManager();

Sie können den Session-Manager auch direkt instanziieren:

use Zend\Session\SessionManager;

$sessionManager = new SessionManager();

Page 39: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.1 Zend\Session

353

13

Über den Session-Manager haben Sie Zugriff auf die Session-Konfiguration und kön-

nen 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 spei-

chern.

Wenn noch keine Session gestartet wurde, können Sie dies manuell machen. Sie kön-

nen die Session wieder löschen, wobei Session-Daten und Session-Cookie auch

gelöscht werden:

$sessionManager->start();[...]$sessionManager->destroy();

Außerdem können 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

Standardmäßig werden Session-Daten durch den SaveHandler auf Dateiebene

gespeichert, wobei Sie den Pfad zu dem Verzeichnis anpassen können. Möchten Sie

Session-Daten in einer Datenbank speichern, müssen Sie den SaveHandler anpassen.

Listing 13.2 zeigt den SQLite3-Dump für die Datenbanktabelle sessions zum Spei-

chern der Session-Daten:

DROP TABLE sessions;CREATE TABLE sessions (id varchar(32) primary key,name varchar(32),data text,

Page 40: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

354

modified integer,lifetime integer

);

Listing 13.2 SQL-Dump für Datenbanktabelle »sessions« für SQLite3

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

wird ein Datenbankadapter für die SQLite3-Datenbank initialisiert, ein TableGate-

way-Objekt für die sessions-Tabelle instanziiert und ein Optionen-Objekt für den

SaveHandler erstellt. Das TableGateway-Objekt und die Optionen werden wiederum

für die Instanziierung des DbTableGateway-SaveHandler benötigt. Danach sind die

Vorbereitungen abgeschlossen.

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

$db = new Adapter(array('driver' => 'Pdo_Sqlite','database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',

));

$tableGateway = new TableGateway('sessions', $db);$options = new DbTableGatewayOptions();$saveHandler = new DbTableGateway($tableGateway, $options);$sessionManager = new SessionManager();$sessionManager->setSaveHandler($saveHandler);$sessionManager->start();$sessionManager->writeClose();

$rows = $tableGateway->select();

foreach ($rows as $row) {Debug::dump($row->getArrayCopy());

}

Listing 13.3 Session-SaveHandler für das »DbTableGateway« ändern

Als Nächstes 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-

Page 41: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.2 Zend\Permissions\Acl

355

13

rufen wird. Hier dient der Aufruf nur zu Demonstrationszwecken, damit bei der

Abfrage der Daten über das TableGateway auch beim ersten Seitenaufruf etwas ausge-

geben wird. Die Session-Daten werden in der Datenbank abgelegt und können wei-

terverwendet werden. So könnte eine Verknüpfung zu einem bestimmten Benutzer

abgelegt werden oder es könnte abgefragt werden, welche Sessions sich in den letz-

ten 5 Minuten verändert haben, um die Anzahl der aktiven Nutzer zu schätzen.

13.2 Zend\Permissions\Acl

Bei der Autorisierung legen Sie fest, welche Funktionen ein Benutzer in der Anwen-

dung ausführen darf. Dafür stellt Zend\Permissions\Acl eine Zugriffskontrollliste

(access control list, kurz ACL) bereit. Sie legt fest, wer auf die vorhandenen Ressour-

cen welche Rechte anwenden darf oder nicht. Details finden Sie im Referenzhand-

buch unter http://zf2.readthedocs.org/en/latest/index.html#zend-permissions-acl.

13.2.1 Begrifflichkeiten

Eine ACL besteht aus mehreren Bestandteilen. Das erste Element sind die Benutzer-

rollen. Beispiele hierfür sind Gäste, Kunden, Redakteure oder Administratoren. Die

Rollen können mit Zend\Permissions\Acl verschachtelt werden, sodass ein Adminis-

trator z. B. alle Rechte der Gäste, Kunden und Redakteure erben kann.

Das zweite Element sind die Ressourcen. Dabei handelt es sich um die Objekte, auf

die Rechte ausgeübt werden sollen. Dies können z. B. Produkte wie eine Pizza, Artikel

aus dem CMS oder ein Profilbild sein. Oft werden auch die Action-Controller als Res-

sourcen verwendet. Auch Ressourcen können voneinander erben.

Das dritte Element sind die Privilegien. Dabei geht es darum, welche Aufgabe mit

einer Ressource ausgeführt werden soll. Ein Produkt kann bestellt oder verändert

werden, ein Artikel kann erstellt oder gelöscht werden, und ein Profilbild kann ver-

kleinert oder ausgedruckt werden. Oft werden die Aktionsmethoden aus den Action-

Controllern als Privilegien verwendet.

Als viertes Element dienen Regeln. Diese besagen, dass eine Rolle auf eine Ressource

ein Privileg anwenden darf oder nicht. Kunden dürfen Produkte bestellen, Redak-

teure dürfen Artikel erstellen und Administratoren dürfen Profilbilder verkleinern.

13.2.2 ACL definieren

In Listing 13.4 wird eine ACL für einen Pizza-Service definiert. Die Rollen guest, custo-

mer, staff und admin werden definiert, wobei customer von guest und staff von

Page 42: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

356

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:

� Gäste dürfen Produkte anzeigen und auflisten.

� Kunden dürfen Produkte in den Warenkorb legen und alles tun, was Gäste dürfen.

� Mitarbeiter dürfen Produkte anlegen und bearbeiten und alles tun, was Kunden

und Gäste dürfen.

� Gäste dürfen nichts mit Bestellungen machen.

� Kunden dürfen Bestellungen anlegen und abschicken.

� Mitarbeiter dürfen Bestellungen verändern, auflisten und abschließen.

� Administratoren dürfen alles.

Übrigens ist der Aufruf von deny() überflüssig, da alle Rollen für alle Ressourcen erst

einmal nichts dürfen. Zudem können Sie auch globale Rechte vergeben und sperren,

indem Sie keine Privilegien (und Ressourcen) beim Aufruf von allow() und deny()

angeben.

Page 43: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.2 Zend\Permissions\Acl

357

13

13.2.3 ACL abfragen

Eine ACL wird mit isAllowed() abgefragt, wobei die Rolle, die Ressource und das Pri-

vileg oder Teile davon angegeben werden. Listing 13.5 zeigt die Abfrage der ACL von

oben. Es wird true oder false zurückgegeben, abhängig von den vorhandenen Rech-

ten der Rolle.

use Zend\Debug\Debug;use Zend\Permissions\Acl\Acl;

[...]

Debug::dump($acl->isAllowed('guest', 'product', 'show'));Debug::dump($acl->isAllowed('guest', 'product', 'basket'));Debug::dump($acl->isAllowed('guest', 'order', 'create'));Debug::dump($acl->isAllowed('customer', 'product', 'basket'));Debug::dump($acl->isAllowed('customer', 'product', 'update'));Debug::dump($acl->isAllowed('customer', 'order', 'create'));Debug::dump($acl->isAllowed('staff', 'product', 'basket'));Debug::dump($acl->isAllowed('staff', 'product', 'create'));Debug::dump($acl->isAllowed('staff', 'product', 'delete'));Debug::dump($acl->isAllowed('admin', 'product', 'show'));Debug::dump($acl->isAllowed('admin', 'product', 'delete'));Debug::dump($acl->isAllowed('admin', 'order', 'finish'));

Listing 13.5 Zend\Permissions\Acl abfragen

Es ist denkbar, bei einer Abfrage kein Privileg abzugeben, wenn Sie prüfen 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 geprüft, 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(

Page 44: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

358

'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 können. Im Gegensatz

zur ACL liegt der Fokus auf den Rollen und nicht auf den Ressourcen. Die Details fin-

den Sie im Referenzhandbuch unter http://zf2.readthedocs.org/en/latest/index.

html#zend-permissions-rbac.

13.3.1 Begrifflichkeiten

Die RBAC basiert auf drei Bausteinen. Das erste Element ist die Identität, z. B. Luigi,

Alessandro und Francesca. Jeder Benutzer hat genau eine Identität.

Das zweite Element sind die Rollen. Eine Identität kann verschiedene Rollen anneh-

men. Während Alessandro der einzige Administrator ist, sind Luigi, Alessandro und

Francesca alle Mitarbeiter. Rollen können auch unterteilt sein.

Page 45: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.3 Zend\Permissions\Rbac

359

13

Das dritte Element sind die Berechtigungen. Eine Berechtigung kann verschiedenen

Rollen zugeordnet sein, während eine Rolle verschiedene Berechtigungen haben

kann. Während ein Administrator Bestellungen löschen kann, kann ein Mitarbeiter

sie nur verändern.

13.3.2 RBAC definieren

Bitte beachten Sie, dass Sie nicht wie bei der ACL globale Rechte vergeben können. Es

ist nicht möglich, einem Administrator alle Berechtigungen in einem Rutsch zu

geben. Sie müssen für jede Rolle alle Genehmigungen definieren oder mit Hierar-

chien arbeiten.

Um die RBAC zu definieren, müssen Sie Rollen, Berechtigungen und Beziehungen zu

anderen Rollen festlegen. Danach können 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, können 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');

Page 46: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

360

$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 Präfix (wie 'pizza' oder 'order'), einem

Unterstrich und dem eigentlichen Namen (wie 'list', 'basket' oder 'cancel'). Sie kön-

nen diesen Vorschlag übernehmen, die Reihenfolge ändern, einen Punkt als Trenner

verwenden oder mit Zahlen arbeiten. Zudem können Sie auch den Namen eines Con-

trollers und einer Aktionsmethode verwenden. Wichtig ist nur dass jede Berechti-

gung eindeutig ist.

Das erstellte Rbac-Objekt lässt sich cachen. Die Vorgehensweise für das Cachen eines

Acl-Objekts finden Sie in Listing 13.6.

13.3.3 RBAC abfragen

Für die Abfrage der RBAC müssen 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 Prüfungen für die vorherige RBAC vorgenommen,

wobei die ersten sieben Zeilen true und die letzten vier false ausgeben. Bei den feh-

lerhaften Prüfungen sind die abgefragten Berechtigungen für die Rolle nicht vorhan-

den. 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'));

Page 47: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.4 Zend\Authentication

361

13

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 für die Authentifizierung

zuständig sind. Außerdem 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#zend-

authentication.

Ein Beispiel für einen Authentifizierungsadapter, der für die Passwortverschlüsse-

lung 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 müssen Sie die Varianten Basic Authentication

und Digest Authentication unterscheiden. Der Unterschied ist, dass die Passwörter

bei der Digest Authentication nicht im Klartext übermittelt werden.

Für die Basic Authentication wird die Passwortdatei /data/auth/basic.pw benötigt

(siehe Listing 13.9). Der Zeilenaufbau ist Benutzername:Realm:Passwort, wobei die

Passwörter unverschlüsselt sind.

luigi:Luigis Pizza-Service:luigifrancesca:Luigis Pizza-Service:francescaalessandro:Luigis Pizza-Service:alessandrovalentina:Luigis Pizza-Service:valentina

Listing 13.9 Die Passwortdatei basic.pw für eine Basic-HTTP-Authentication

Das Beispiel läuft 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 für die Passwortdatei konfiguriert

und Resolver, Request und Response werden an den Adapter übergeben. Durch den

Page 48: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

362

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

ausgewertet werden und ermöglicht bei Erfolg die Abfrage der angemeldeten Identi-

tät.

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, können Sie das Bei-

spiel ausprobieren.

Für 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,

Page 49: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.4 Zend\Authentication

363

13

nur ist das Passwort mit md5() verschlüsselt und der Hash wird z. B. aus der Kombina-

tion luigi:Luigis Pizza-Service:luigi gebildet.

luigi:Luigis Pizza-Service:6b150f7dc4cdc0fe1b16315482544685francesca:Luigis Pizza-Service:d23e77cb95c9129102cd8452a9e10390alessandro:Luigis Pizza-Service:b03fd2ec130d394f1af3960e3bb37017valentina:Luigis Pizza-Service:8792865b2896655c5de293ef425a06c3

Listing 13.11 Die Passwortdatei digest.pw für eine Digest-HTTP-Authentication

Der Ablauf der Digest Authentication ist in Listing 13.12 (gekürzt) zu sehen und unter-

scheidet sich kaum von der Basic Authentication. Die Konfiguration des accept_

schemes ist anders, die Passwortdatei für 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,

));

$digestResolver = new FileResolver();$digestResolver->setFile(LUIGI_ROOT . '/data/auth/digest.pw');

$adapter->setDigestResolver($digestResolver);

[...]

Listing 13.12 Digest-HTTP-Authentication mit Http-Adapter (gekürzt)

13.4.2 Gegen eine Datenbanktabelle authentifizieren

Mit Zend\Authentication können Sie gegen eine Datenbanktabelle authentifizieren.

Listing 13.13 zeigt einen SQLite3-Dump für die Tabelle users, die die Benutzerdaten

enthält. Das Passwort für den Benutzer »luigi« lautet »luigi«.

DROP TABLE users;CREATE TABLE users (id integer primary key,name varchar(32),

Page 50: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

364

pass varchar(32));INSERT INTO "users"

VALUES (1,'luigi','ccebba93f54d6bf2b17f8350e7c12ec4');

Listing 13.13 SQL-Dump für die Datenbanktabelle »users« für SQLite3

Passwortverschlüsselung mit Bcrypt

Der Einfachheit halber werden die Passwörter mit md5() verschlüsselt. Sicherer ist

eine Verschlüsselung mit Bcrypt. In Abschnitt 17.3, »Authentifizierung und Autori-

sierung«, finden Sie einen Authentifizierungsadapter, der zur Verschlüsselung

Bcrypt verwendet.

Zur Authentifizierung gegen eine Datenbanktabelle kommt der DbTable zum Einsatz.

In Listing 13.14 werden Zugangsdaten notiert und wird der Authentifizierungsadap-

ter mit dem Datenbankadapter und den Namen für die Tabelle, Benutzerspalte und

Passwortspalte konfiguriert.

use Zend\Authentication\Adapter\DbTable;use Zend\Db\Adapter\Adapter;use Zend\Debug\Debug;

$credentials = array(array('name' => 'francesca', 'pass' => 'francesca'),array('name' => 'luigi', 'pass' => 'francesca'),array('name' => 'luigi', 'pass' => 'luigi'),

);

[...]

$authAdapter = new DbTable($db, 'users', 'name', 'pass');

foreach ($credentials as $row) {$authAdapter->setIdentity($row['name']);$authAdapter->setCredential(md5($row['pass']));

$result = $authAdapter->authenticate();

Debug::dump($result);

if ($result->isValid()) {

Page 51: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.4 Zend\Authentication

365

13

Debug::dump($authAdapter->getResultRowObject(null, 'pass'));}

}

Listing 13.14 Authentifizierung mit dem DbTable-Adapter

Für jede Zeile werden im Authentifizierungsadapter der Benutzername und das Pass-

wort festgelegt und wird die Authentifizierung gestartet. War der Versuch erfolglos,

wird das Result-Objekt ausgegeben. Dem Result-Objekt können Sie die genaue Feh-

lermeldung entnehmen. War die Authentifizierung erfolgreich, wird zusätzlich der

gefundene Datensatz mit getResultRowObject() ausgegeben. Durch die Angabe von

'pass' als zweiten Parameter wird der Inhalt der Passwortspalte nicht zurückge-

geben.

13.4.3 Authentifizierungsservice

Sie können Ihre Benutzerauthentifizierung direkt mit einem der bisher vorgestellten

Adapter durchführen. Der Zend\Authentication\AuthenticationService erleichtert

die Authentifizierung jedoch noch weiter. Um den Ablauf an einem praktischen Bei-

spiel zu demonstrieren, benötigen Sie ein Formular zum Anmelden und Abmelden

(siehe Listing 13.15). Weitere Details zu Zend\Form finden Sie in Kapitel 12, »Formular-

verarbeitung«.

namespace Pizza\Form;

use Zend\Form\Element\Password;use Zend\Form\Element\Submit;use Zend\Form\Element\Text;use Zend\Form\Form;

class LoginForm extends Form{public function __construct(){parent::__construct('login');

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

Page 52: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

366

$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 benötigt einen Authentifizierungsadapter (siehe Listing

13.16) Zu Beginn werden der AuthenticationService und das Request-Objekt initia-

lisiert, und es wird geprüft, ob eine POST-Anfrage vorliegt. Wenn dies der Fall ist, wird

überprüft, ob der Login-Button geklickt, aber kein Benutzername eingegeben wurde.

In diesem Fall wird eine Fehlermeldung festgelegt. Die nächste Prüfung schaut nach

dem Login-Button. In diesem Fall werden der Datenbankadapter und der Authenti-

fizierungsadapter konfiguriert, wobei der Authentifizierungsadapter den Benutzer-

namen und das Passwort übergeben bekommt. Danach wird die Authentifizierung

durchgeführt. Mögliche Fehlermeldungen werden zwischengespeichert. Die letzte

Prüfung schaut nach dem Logout-Button und zerstört bei Bedarf die aktuelle Identi-

tät und meldet den Nutzer ab. Der Rest des Listings kümmert sich um die Ausgabe

der Meldungen und des Formulars.

use Pizza\Form\LoginForm;use Pizza\Form\LogoutForm;use Zend\Authentication\AuthenticationService;use Zend\Authentication\Adapter\DbTable;use Zend\Db\Adapter\Adapter;use Zend\Http\PhpEnvironment\Request;

Page 53: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13.4 Zend\Authentication

367

13

$authService = new AuthenticationService();$request = new Request();

if ($request->isPost()) {if ($request->getPost('login') && !$request->getPost('name')) {$showMessage = 'Es wurde kein Benutzername eingegeben';

} elseif ($request->getPost('login')) {$db = new Adapter(array('driver' => 'Pdo_Sqlite','database' => LUIGI_ROOT . '/data/db/session.sqlite3.db',

));

$authAdapter = new DbTable($db, 'users', 'name', 'pass');$authAdapter->setIdentity(strtolower($request->getPost('name'))

);$authAdapter->setCredential(md5($request->getPost('pass')));

$result = $authService->authenticate($authAdapter);

if (!$result->isValid()) {$showMessage = implode('<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()

Page 54: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

13 Benutzermanagement

368

? 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 lässt sich mit allen Adaptern für die Authentifizierung

kombinieren. Die Vorgehensweise ist dabei prinzipiell dieselbe, wobei nicht jedes

Mal ein Formular benötigt wird. In Abschnitt 17.3, »Authentifizierung und Autorisie-

rung«, finden Sie ein Modul, das die Authentifizierung mit der Autorisierung im

MVC-Kontext verknüpft.

13.5 Zend\Ldap

Die Zend\Ldap-Komponente ermöglicht die Kommunikation zwischen Ihrer Anwen-

dung und einem LDAP-Verzeichnis. Sie können Zend\Ldap eigenständig und als

Adapter mit Zend\Auth einsetzen. Weitere Details zu Zend\Ldap finden Sie im Refe-

renzhandbuch unter http://zf2.readthedocs.org/en/latest/index.html#zend-ldap.

Page 55: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

611

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

Entität ...................................................................... 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

Textblöcke .............................................................. 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

Einführung ............................................................. 211

Objekt-Zugriff ....................................................... 214

RESTful-Controller .............................................. 218

Services injizieren ................................................ 215

Controller-Plugin

Basket..................................................................... 580

Page 56: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

612

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

Entitäten ................................................................ 283

Entity-Manager .................................................. 286

Installation............................................................ 281

Modul konfigurieren ......................................... 282

Relationen ............................................................. 285

Reverse Engineering ......................................... 286

Doctrine/Common ................................................. 343

DoctrineORMModule ............................................ 281

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

Page 57: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

613

Fremdmodule (Forts.)

ZfcUser ..................................................................... 181

ZFTool....................................................................... 69

G

GetOrder-View-Helper ......................................... 586

Git & GitHub ............................................................... 39

Einführung .............................................................. 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

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

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

Modularität ............................................................ 40

Service-Locator...................................................... 43

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

Modularität ................................................................. 40

Anwendungsmodul ........................................... 169

Fremdmodule ....................................................... 179

Library-Modul ...................................................... 177

Module.php.............................................................. 77

Page 58: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

614

Modularität (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

Passwörter verschlüsseln..................................... 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

Entität .................................................................... 489

Modelinfrastruktur ............................................ 485

Pizza-Karussell ................................................... 502

Pizza-Service ........................................................ 490

TableGateway ..................................................... 486

Vorbereitungen .................................................. 484

Placeholder-View-Helper ..................................... 252

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

Page 59: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

615

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

Menüleiste............................................................ 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

Page 60: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

616

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

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

Einführung ............................................................... 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

Page 61: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

617

Zend\Config................................................................ 90

ACL cachen ............................................................ 357

Factory ...................................................................... 91

Kaskadierendes Laden........................................ 82

PHP-Array einlesen .............................................. 91

Reader ...................................................................... 90

Writer......................................................................... 91

YAML-Unterstützung 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

Entität-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

Entität-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

Entität-Klasse ....................................................... 272

EventFeature ........................................................ 275

Formular ............................................................... 494

GlobalAdapterFeature...................................... 275

MasterSlaveFeature........................................... 275

MetadataFeature................................................ 275

RowGatewayFeature............................... 275, 280

Zend\Db\TableGateway (Forts.)

Verknüpfungstabelle ........................................ 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

Einführung ............................................................. 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

Einführung ............................................................ 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

Page 62: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

618

Zend\Form (Forts.)

Twitter Bootstrap ............................................... 337

Upload durchführen ......................................... 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

eigenständige 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

Zend\ModuleManager (Forts.)

Autoloading .......................................................... 157

Controller konfigurieren ................................. 164

Controller-Plugins konfigurieren................. 166

Einführung .............................................................. 151

Fremdmodule ....................................................... 179

Konfiguration ............................................... 155, 157

Konfigurationsdaten ......................................... 158

Konfigurationsschlüssel ................................... 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

Einführung ............................................................. 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

Menüs 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

Page 63: Zend Framework 2 - Amazon Simple Storage Service · Inhalt 6 3 Das Zend Framework einrichten 53 3.1 Voraussetzungen..... 53

Index

619

Zend\Permissions\Acl .......................................... 355

ACL abfragen ........................................................ 357

ACL cachen ............................................................ 357

ACL definieren...................................................... 355

Autorisierungsservice ....................................... 461

Benutzerrechte prüfen ..................................... 476

Privilegien .............................................................. 355

Regeln ...................................................................... 355

Ressourcen ............................................................ 355

Rollen....................................................................... 355

Zend\Navigation ................................................ 301

Zend\Permissions\Rbac ....................................... 358

Berechtigungen ................................................... 359

Identitäten............................................................. 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