web & mobile DEVELOPER 08 / 2015 – PHP Framework Yii 2.0

wmd-2015-08

 

PHP Framework Yii 2.0

Egal welchen Framework-Vergleich man in den letzten zwei Jahren bemüht – fast immer landet das PHP-Framework Yii auf dem ersten Platz. Und das oftmals weit vor Symfony, Laravel, Cake PHP und Zend Framework. Grund genug, sich Yii einmal genauer anzusehen, um herauszufinden, woher die Faszination kommt.

Von Patrick Lobacher

 

Der Claim des Frameworks lautet: „Yii – das schnelle, sichere und professionelle PHP Framework“. Yii ist ein objektorientiertes, komponentenbasiertes Open Source-Applikations-Framework in PHP. Dabei bietet Yii eine Reihe von Features wie z.B. MVC, DAO/ActiveRecord, I18N/L10N, Caching, Authentication und rollenbasierte Zugriffskontrolle, Scaffolding, Tests u.v.m. Die aktuelle Version 2.0.4 wurde am 10.05.2015 veröffentlicht. Die Version 2 führt vor allem PHP namespaces und Traits ein, unterstützt den PSR Standard, und verwendet Composer sowie Bower. Zudem wurden RESTful APIs, Widget-Unterstützung (Bootstrap) und vieles andere mehr hinzugefügt.

Alleine 1700 Extensions (davon 1300 auf Packagist) warten darauf, das ohnehin schon mächtige Grundsystem zu erweitern.

Installation von Yii

Yii kann auf zwei Methoden installiert werden – entweder man lädt sich das entsprechende Paket auf http://www.yiiframework.com/download/ herunter oder aber man installiert per Composer. Letzteres ist unbedingt zu empfehlen, da hiermit ein leistungsfähiges Paket-Management zur Verfügung steht, welches gerade bei Upgrades und Installation von Plugins eine große Hilfe ist.

Unter Linux und MacOS X können Sie Composer wie folgt installieren – für Windows verwenden Sie https://getcomposer.org/Composer-Setup.exe.

Listing 1: Installation von Composer

Nach der Installation von Composer kann nun das Yii-Framework geladen werden.

Listing 2: Installation von Yii

Der erste Befehl installiert das sogenannte „Composer Asset Plugin“, welches eine Verwaltung von bower und npm Pakete durch Composer ermöglicht. Dies muss lediglich einmal durchgeführt werden. Der zweite Befehl installiert das Basis-Template im Ordner basic (der natürlich geändert werden kann).

Hat man sich für die manuelle Installation entschieden, so muss man noch einen Key anlegen, der für die Cookie-Validierung benötigt wird – dazu öffnet Sie die Datei config/web.php und tragen diesen ein:

Listing 3: Cookie-Key in der Datei web.php

Sie können nun entweder das Document-Root Ihres Webservers auf das Verzeichnis basic/web/ zeigen lassen (empfohlen) und zum Test die URL http://localhost/ aufrufen oder aber (wenn Sie die Installation ins Document-Root gemacht haben) mit http://localhost/basic/web/ die Demo-Seite anzeigen lassen.

Für Apache sollten Sie daher folgende Einstellungen in der Datei httpd.conf machen:

Listing 4: httpd.conf

yii2_lobacher_01

Sollte es zu einer Fehlermeldung gekommen sein, so kann man im Installationsverzeichnis  $ php requirements.php ausführen, um einen detallierten Fehlerreport zu erhalten.

Verzeichnisstruktur

Schauen wir uns als nächstes die wichtigsten Dateien und Ordner in der erhaltenen Verzeichnisstruktur an:

  • composer.json
    Composer Meta-Informationen
  • config/db.php
    Konfigurationseinstellung für die Datenbank
  • config/web.php
    Konfigurationseinstellung für die Web-App
  • controllers/
    Enthält die Controller-Klassen
  • models/
    Enthält die Model-Klassen
  • runtime/
    Hier legt Yii alle Dateien ab, die zur Laufzeit erzeugt werden, wie z.B. Logs, Caches, u.ä.
  • vendor/
    Enthält das Framework ansich und alle 3rd-Party Module
  • views/
    Enthält die View-Dateien
  • web/assets/
    Enthält die öffentlichen Assets (wie JS, CSS, …)
  • web/index.php
    Dies ist der Bootstrapper, der bei jedem Request aufgerufen wird

Ablauf eines Request

Um die Arbeitsweise von Yii zu verstehen, schauen wir uns einen typischen Request-Zyklus an. Dabei wird ein klassischer MVC-Ablauf eingehalten:

  • Am Anfang wird jeder Request über den Boostrapper web/index.php geleitet
  • Der Bootstrapper lädt nun die Konfiguration und erstellt eine Instanz der Applikation, um den Request zu verarbeiten
  • Die Applikation löst nun die angeforderte Route auf
  • Nun erstellt die Applikation eine Controller-Instanz
  • Der Controller erstellt daraufhin eine Action-Instanz und führt eventuell vorhandene Filter auf der Action aus
  • Wenn einer der Filter fehl schlägt, wird die Action abgebrochen – sollten alle Filter erfolgreich angewendet werden, wird die Action ausgeführt
  • Die Action lädt nun das Data Model (beispielsweise von der Datenbank)
  • Daraufhin rendert die Action den View und versorgt diesen mit dem Data
  • Das gerenderte Resultat wird nun an die Response Komponente zurückgegeben, welche damit den Browser versorgt und das Ergebnis anzeigt

Hello World

Selbstverständlich halten auch wir uns an das ungeschrieben Gesetz, als erste Aktion eine „Hello World“ Ausgabe zu erzeugen, dafür wollen wir eine entsprechende Action anlegen. Dies wird im Controller erledigt – daher fügen wir folgenden Code zur Datei controllers/SiteController.php hinzu:

Listing 5: SiteController.php

Es wurde hier eine say Action als Methode mit dem Namen actionSay hinzugefügt. Der Prefix action ist für Yii die Unterscheidung, ob es sich um eine Action oder eine normale Methode handelt. Danach wird die sogenannte Action-ID mit UpperCamelCase-Bezeichnung notiert.

Weiterhin nimmt die Action den Parameter $message auf, dessen Default-Wert „Hello World“ ist, falls der Parameter leer ist. Der Parameter wird beispielsweise gesetzt, indem wir beim Aufruf diesen als Parameter an die URL hängen.

Die Methode render() wiederum übergibt diesen Paramater als Variable mit dem Namen say an den View und rendert selbigen. Anschließend wird das Ergebnis mittels return() an den Browser gesendet.

Nun wird noch ein entsprechender View benötigt, den Yii in der Datei say.php sucht, die im Verzeichnis views/site/ liegen muss.

Listing 6: say.php

Hier wird die Nachricht von enkodiert, da es ansonsten zu XSS kommen könnte.

Nun ist der Request komplett und wir können das Ergebnis betrachten, in dem wir die URL http:// localhost/index.php?r=site/say&message=Hello+World aufrufen.

yii2_lobacher_02

 

Der Parameter r steht dabei für „Route“ – der Wert dazu hat das Format ControllerID/ActionID. und ruft die entsprechende Action im angegebenen Controller auf.

Formulare

Als nächstes wollen wir erreichen, dass die Nachricht über ein Formular eingegeben werden kann.

Dazu benötigen wir ein Model, eine entsprechende Action und natürlich einen View. Starten wir daher mit dem Model, welches die Daten des Eingabeformulars aufnehmen kann. Dazu legen wir eine Datei models/EntryForm.php an:

Listing 7: EntryForm.php

Die Model-Klasse erweitert die Klasse yii\base\Model, welches eine Yii-Basisklasse ist, die prädestiniert zur Repräsentation von Formular-Daten ist, die nicht mit der Datenbank assoziiert sind (hier würde man yii\db\ActiveRecord verwenden).

Die Klasse enthält weiterhin zwei öffentliche Properties name und email, welche die eingegebenen Daten speichern. Die Methode rules() enthält ein Set an Validierungsoptionen. Im Beispiel werden beide Properties als required (benötigt) deklariert, müssen also in jedem Fall eingegeben werden. Zudem wird festgelegt, dass die Property email eine gültige Email-Adresse sein muss.

Nun benötigen wir eine zugehörige Action, die wir in der Datei controllers/SiteController.php ans Ende einfügen:

Listing 8: SiteController.php

Zunächst wir nachgesehen, ob Daten per POST übergeben wurden und ob das Model validiert. Ist dies der Fall könnten nun weitere Verarbeitungsschritte folgen, bis am Ende das Model als Bezeichner entry-confirm an den View weitergeleitet wird. Wenn allerdings ein Fehler aufgetreten war oder ein initialer Aufruf stattgefunden hat, wird der View als entry angesprochen.

Wir benötigen nun als zwei Views in Form der Dateien views/site/entry-confirm.php und views/site/entry.php:

Listing 9: Der View entry-confirm

Hier weden nun wie bereits zuvor, die übergebenen Daten ausgegeben. Deutlich spannender ist der View entry:

Listing 10: Der View entry

Denn hier wird das Formular ausgegeben und auch allerhand „magische“ Dinge erledigt.

yii2_lobacher_03

 

Zunächst wird eine Validierung durchgeführt – zuerst per JavaScript und anschließend serverseitig via PHP. Das Objekt yii\widgets\ActiveForm liest dazu die Validierungsregeln aus dem Model aus und erzeugt hierfür ausführbaren JavaScript Code. Sollte JavaScript im Browser deaktiviert sein, wird zudem eine PHP-Validierung durchgeführt.

Die Label der Input-Felder werden über die field() Methode generiert, indem dort die Property-Namen ausgelesen werden. Will man dieses überschreiben, so kann man dies wie folgt durchführen: $form->field($model, 'name')->label('Eigenes Label').

Datenbanken

Wir wollen nun die Verbindung zu einer Datenbank herstellen. Dazu legen wir eine Datenbank manuell mit dem Namen yii2basic an und führen darauf folgende SQL-Befehle aus:

Listing 11: SQL-Befehle für DB yii2basic

Hier haben wir eine Tabelle city angelegt, welche die Daten KFZ-Kennzeichen (kfz), Name der Stadt (name) und Anzahl Einwohner (population) für die 10 größten Städte in Deutschland enthält.

Als nächstes müssen wir die Datenbankverbindung konfigurieren. Dazu öffnen wir die Datei config/db.php und editieren diese wie folgt – vor allem das Passwort zur Datenbank muss hier eingetragen werden:

Listing 12: db.php

Weiter geht es mit dem Model, welches wir nun von der Klasse ActiveRecord ableiten lassen. Dazu legen wir eine Datei models/City.php an:

Listing 13: City.php

Tatsächlich benötigen wir erst einmal keinen weiteren Code, da Yii die Klasse (und damit auch die Properties) automatisch mit dem Table aus der Datenbank matcht.

Weiterhin wird natürlich ein Controller benötigt, den wir in der Datei controllers/CityController.php anlegen:

Listing 14: CityController.php

 

Hier passiert nun folgendes:

  • Die index Action ruft als erstes die Methode City::find() auf
  • Dadurch wird der ActiveRecord einen DB-Query zusammenstellen und damit alle Einträge aus dem City-Table der Datenbank holen. Die Sortierung erfolgt nach dem Namen der Stadt
  • Damit ggf. nicht zuviele Einträge auf einmal angezeigt warden müssen, wird ein Pagnierungs-Objekt verwendet.
  • Nun werden sowohl die aus der Datenbank erhaltenen Städte, wie auch die Paginierung an den View übergeben

Den View wiederum realisieren wir in der Datei views/city/index.php:

Listing 15: Der View index

Das Ergebnis kann sich sehen lassen.

 

yii2_lobacher_04

 

Code-Generiereung mit Gii

Yii enthält das sehr leistungsfähig Tool Gii, mit dem es möglich ist, Code automatisch zu generieren. Der Aufruf erfolgt über http://localhost/r=gii.

yii2_lobacher_05

 

Starten wir nun mit dem „Model Generator“. Hierzu geben wir als „Table Name“ city ein und als „Model Class“ City. Nach einem Klick auf „Preview“ haben Sie die Möglichkeit den Code der zu erzeugenden Klasse oder einen Diff zu einer eventuell schon vorhandene Klasse anzuzeigen. Wir sind damit zufrieden und klicken daher die Checkbox „override“ rechts neben dem Dateinamen und anschließend den Button „Generate“.

yii2_lobacher_06

 

Nun benötigen wir den CRUD-Code (Create/Read/Update/Delete) – den wir im „CRUD-Generator“ entsprechend erzeugen können. Dafür muss im Feld „Model Class“ app\models\City (um die Model Klassen zu erzeugen), im Feld „Search Model Class“ app\models\CitySearch (um die entsprechende Search-Klasse zu erzeugen), im Feld „Controller Class“ app\controllers\CityController (um die Controller-Klasse zu erzeugen) und im Feld „View Path“ @app/views/city (für den View) eintragen.

yii2_lobacher_07

 

Durch den Aufruf von http://localhost/index.php?r=city/index erhält man ein Grid, welches die Städte, samt KFZ und Einwohner angezeigt. Oben kann man die Anzeige filtern und darüber eine neue Stadt anlegen. Rechts neben jeder Stadt findet man Icons, um den Datensatz anzuzeigen, zu editieren und schließlich zu löschen

yii2_lobacher_08

Fazit

Auch wenn der Artikel schon sehr viele Aspekte con Yii gezeigt hat, geht die Reise hier erst los. Denn Yii enthält sehr viele komplexe Themen, an die man sich aber erstaunlich schnell annähern kann. Mit Yii ist die Erstellung von Web-Apps nicht nur sehr einfach möglich – es macht auch viel Spaß.

Links

Offizieller Yii 2.0 Framework Website
http://www.yiiframework.com
The Definitive Guide
http://www.yiiframework.com/doc-2.0/guide-README.html
GitHub Account
https://github.com/yiisoft/yii2
Yii Framework Deutschland
http://www.yiiframework.de/
Yii Tutorial
http://code.tutsplus.com/articles/introduction-to-the-yii-framework--cms-20948

 

Yii Extensions
http://www.yiiframework.com/extensions/

 

Yii Packagist
https://packagist.org/search/?q=yii

 

Leave a Comment.