Kohana PHP Framework, kein unbekannter Name in der Liste der PHP Frameworks. Zurecht wie ich finde, denn Kohana hat einiges zu bieten. Speziell diejenigen unter euch, welche CodeIgniter kennen, dessen Vorteile schätzen und damit arbeiten könnten Kohana einiges abgewinnen.
Ich persönlich habe Kohana über CodeIgniter kennengelernt, denn ursprünglich ist Kohana ein Fork von CodeIgniter.
Aktuell ist Kohana in 2 verschiedenen Versionen verfügbar. Kohana ist communitygetrieben und steht unter der BSD Lizenz.
Kohana 2 oder Kohana 3?
Kohana gibt es mittlerweile in 2 verschiedenen Versionen, dies wären 2.x und 3.x. Beide sind derzeit noch aktiv in Entwicklung. Die aktuelle “stable” der 2er Version ist die 2.3.4. Die Version 2.4 (derzeit RC2) wird laut den Entwicklern das letzte Major Release sein. Die aktuelle “stable” der 3er Version ist die 3.0.6.
Jetzt stellst du dir sicher die berechtigte Frage nach den Unterschieden zwischen den Versionen? Beide Versionen haben Ihr eigenes Entwickler-Team und arbeiten unabhängig voneinander. Kohana 2 benützt das MVC Design Pattern, wobei Kohana 3 zusätzlich das HMVC Design Pattern unterstützt, doch dazu später mehr. Weiters wurde die Version 3 von Grund auf neu geschrieben. Die Änderungen sind ziemlich weitläufig, auch die API hat sich, im Vergleich zur 2er Version, deutlich geändert. Abwärtskompatibilität? Fehlanzeige, nicht ohne aufwändige Eingriffe.
Wie steht’s um das Thema Dokumentation? Kohana 2 und Kohana 3 teilen sich ein Supportforum und einen IRC Channel. Beide haben einen User-Guide, wobei der von Kohana 2 bisher deutlich ausführlicher und detailreicher gehalten ist. Für Kohana 3 gibt es zusätzlich einen API Browser sowie ein unoffizielles Wiki. Während man für Kohana 2 im Netz viele Tutorials findet, sucht man für Kohana 3 schon mal etwas länger nach bestimmten Helferlein, oft bleibt einem nichts anderes übrig als sich mit dem API Browser abzukämpfen.
Solltest du keinerlei Framework Erfahrung haben, bist du mit Kohana 2 vielleicht besser bedient, den da finden sich derzeit noch deutlich mehr HowTo’s und Tutorials im Netz.
Wie im Kohana Supportforum gut zu erkennen ist, geht der Trend klar in Richtung Kohana 3 … In diese Richtung wird auch dieser Artikel weiter gehen.
Kohana 3 – Systemvoraussetzungen
- Webserver (Apache, lighttpd, IIS, ngnix)
- PHP ab Version 5.2.3 (Extensions: PCRE, iconv, mycrypt und SPL, empfehlenswert ist auch mbstring)
Die Highlights von Kohana 3
Kohana ist striktes PHP5 und 100% OOP, unterstützt UTF-8 und Mehrsprachigkeit (i18n) vollständig und liefert eine Menge an Möglichkeiten flexible Webanwendungen zu entwickeln. Integriertes Klassen-Auto-Loading, ein kaskadierendes Dateisystem, eine hochgradig konsistente API und einfaches implementieren von Fremd-Libaries machen Kohana zum richtigen Werkzeug für jedes Projekt, egal ob Groß oder Klein. So, oder so ähnlich beschreibt sich Kohana auf deren Homepage selbst, schauen wir uns die wichtigsten Features genauer an …
Request Routing
In der boostrap.php Datei lassen sich individuell Routen für deine Applikation anlegen. Mit der Route wird bestimmt, an welchen Controller bzw. Action eine bestimmte Anfrage gehen soll und welche weiteren Parameter erlaubt sind. Mit regulären Ausrücken lässt sich bestimmen in welcher Form übergeben Parameter gültig sein sollen.
Soll zum Beispiel die Anfrage auf http://www.example.com/hilfe zum Controller “static” und Action “help” geroutet werden, kann deine Route so aussehen:
Route::set('hilfe', 'hilfe')
->defaults(array(
'controller' => 'static',
'action' => 'help'
));
Die Kohana Standard Route sieht so aus:
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));
Zu erwähnen wäre vielleicht noch, dass Kohana einen integrierten REST Controller besitzt.
Autoloading / Overloading
Hierbei bedient sich Kohana PHPs “autoload” Möglichkeiten. Voraussetzung ist hier eine strikte Namensgebung für Klassennamen, welche von Kohanas “auto_load” Methode in den Dateinamen umgewandelt werden. Weiters werden die Unterstriche in Slashes (/) umgewandelt.
Soll beispielsweise ein User eingeloggt werden, ist eine Instanz des “Auth” Modules nötig:
$auth = Auth::instance();
Kohana beginnt die Suche nach der richtigen Klassen-Datei in dieser Reihenfolge:
- Application Pfad
- Module Pfad
- System Pfad
Da “Auth” ein Kohana Modul ist, wird Kohana schließlich hier fündig: /modules/auth/classes/auth.php
Kohana benützt ein kaskadierendes Datei-System. Dies ermöglicht es sämtliche Dateien in einer höheren Ebene zu überladen oder zu erweitern, ohne den Originalcode angreifen zu müssen.
Hinweis: Das “Auth” Modul ist nicht standardmässig aktiv und muss in der boostrap.php aktiviert werden.
Transparente Klassenerweiterung
Angenommen wir wollen die Klasse “Kohana_Text” (/system/classes/text.php) erweitern. Die Klasse bietet unterschiedliche Methoden zur Stringbearbeitung, zB kann man sich mit der Methode “random” einen Zufallsstring generieren lassen. Wir wollen diese Klasse nun erweitern, sodass wir nicht nur einen Zufallsstring zurückbekommen, sondern gleich eine Array mit beliebig vielen Strings, in wie weit das sinnvoll ist sei hier jetzt mal dahingestellt.
Wir erstellen also folgende Datei /application/classes/text.php und erstellen eine neue Methode “random_more”.
class Text extends Kohana_Text {
public static function random_more($type = 'alnum', $length = 8, $count = 3) {
$result = array();
for($i=0;$i<$count;$i++) {
array_push($result,Text::random('alnum',8));
}
return $result;
}
}
Unsere eigene Methode, ruft also 3 mal die Originalmethode “random” auf und speichert die generierten Strings in einem Array, welches dann an die aufrufende Stelle zurückgegeben wird.
HMVC
Während beim MVC Design Pattern ein Anfrage an die Webanwendung von nur einem Controller abgearbeitet wird, kann beim HMVC Design Pattern die Anfrage zusätzlich an mehrere Controller weitergeleitet und das Ergebnis zusammengeführt werden. Du kannst dir das wie einen Ajax Request vorstellen, nur halt ohne eine extra Anfrage an den Server. HMVC Anfragen profitieren vom selben Ablauf (Controller/Action) wie herkömmliche Anfragen, auch greifen sämtliche Routing Einstellungen so, als wäre die Anfrage direkt im Browser ausgeführt worden. Am meisten Sinn macht das beispielsweise für Widgets, welche an unterschiedlichen Stellen deiner Seite eingebaut, und zusätzlich in anderen Projekten wiederverwendet werden sollen.
Ein Beispiel:
Du hast einen “widgets” Controller mit der Action “wetter”, welcher als Parameter die PLZ annimmt. Der Controller besitzt ein Model und ein eigenes View um die Ausgabe (das Wetter in einem PLZ Bereich) zu rendern und ist unabhängig ausführbar, da auch eine Partnerseite das Wetter-Widget einbindet:
http://www.example.com/widgets/wetter/88131
Nun willst du den Mitgliedern deiner Community im Profil das aktuelle Wetter anzeigen lassen, glücklicherweise hast du die PLZ beim registrieren abgefragt
Kohana begegnet dem HMVC Gedanken mit seiner Request::factory() Methode. Damit kannst du zu jeder Zeit und von jeder Stelle aus vollwertige “Requests” absenden, auch aus einem View bzw. Template heraus:
<div id="wetter">
<?php echo Request::factory('widgets/wetter/'.$user_plz)->execute()->response; ?>
</div>
Es gäbe natürlich auch andere Wege solch’ Verhaltensweisen zu bewerkstelligen, zB über eigene Libaries, Viewscripte oder mit CURL, jedoch wäre das nicht so elegant, kompakt oder wiederverwendbar.
ORM
ORM steht als Modul zur Verfügung und muss in der boostrap.php aktiviert werden. Mit ORM kannst du Daten in der Datenbank manipulieren, ohne dafür SQL verwenden zu müssen. Voraussetzung ist die Definition eines Models.
Die simpelste Form sieht so aus:
class Model_User extends ORM {} // application/classes/models/user.php
Datensätze laden:
$user = ORM::factory(‘user’); // lädt alle user
$user = ORM::factory(‘user’,7); // lädt user mit ID 7
Datensätze suchen:
$user = ORM::factory(‘user’)
->where(‘name’='hans’)
->where(‘aktiv’=’1′)
->find(); // oder find_all();
Datensatz ausgeben / ändern / speichern / löschen:
echo $user->name;
$user->name = ‘Hans’;
$user>save();
$user->delete();
Kohanas ORM unterstützt auch “Beziehungen” zwischen verschiedenen Models (belongs_to, has_many, has_one).
Caching
Unterstützt werden derzeit folgende cache-engines:
- APC
- eAccelerator
- File
- Memcached
- Memcached-tags
- SQLite
- Xchace
Datenbank
Aktuell unterstützt Kohana 2 “Driver”, und zwar MySQL und PDO. Wie auch bei ORM muss das “Database” Modul erst in der bootstrap.php aktiviert werden. Die Verbindungsdaten zur Datenbank werden in einer eigenen Config-Datei verwaltet: (application/config/database.php)
Mehrere Instanzen zu konfigurieren ist möglich.
Es werden derzeit 2 Arten der Abfragenbildung unterstützt. “Prepared statements” und “query builder”. Bei Prepared statements wird die SQL Anweisung selbst geschrieben, dennoch wird auf escaping nicht verzichtet.
$query = DB::query(Database::SELECT, ‘SELECT * FROM users WHERE username = :user’);
$query->param(‘:user’, ‘john’);
Der query builder escaped automatisch Tabellen- und Spaltennamen sowie auch die Werte.
$query = DB::select()->from(‘users’)->where(‘username’, ‘=’, ‘john’);
$query = DB::insert(‘users’, array(‘username’, ‘password’))->values(array(‘fred’, ‘p@5sW0Rd’));
$query = DB::update(‘users’)->set(array(‘username’ => ‘jane’))->where(‘username’, ‘=’, ‘john’);
$query = DB::delete(‘users’)->where(‘username’, ‘IN’, array(‘john’, ‘jane’));
Auch Datenbank Funktionen wie zB COUNT werden unterstützt:
$query = DB::select(array(‘COUNT(“username”)’, ‘total_users’))->from(‘users’);
Joining / Grouping:
$query = DB::select()->from(‘users’)->join(‘table_2′)->on(‘table_2.table_id’, ‘=’, ‘table_name.id’);
$query = DB::select()->from(‘table_name’)->group_by(array(‘column1′, ‘mycol’));
Generierte Abfrage anzeigen lassen:
echo Kohana::debug((string) $query);
Abfrage absetzen:
$query->execute();
Performance
Bisher konnte ich leider keinen aussagekräftigen Benchmark mit oder gegen Kohana 3 finden. Falls jemand hier schon fündig geworden ist, bitte melden.
Sicherheit
Kohana 3 bietet mit seiner Security Klasse einen XSS Filter an, jedoch wird dieser in künftigen Versionen fehlen. Stattdessen gibt es jetzt das “purifier” Module, welches den bisherigen XSS Filer (Security::xss_clean) überlädt. Verwendet wird hier der HTML Purifier von http://htmlpurifier.org/.
Weiters kommt Kohana 3 mit einer Validation Klasse daher, welche bereits viele an vordefinierten Regeln beinhaltet.
$post = Validate::factory($_POST);
$post->filter('username', 'strtolower'); // Callback auf strtolower für den Usernamen
$post->rule('username', 'not_empty');
Zu erwähnen wäre noch das “userguide” Modul, welches sich wie die anderen Module einfach in der boostrap.php einschalten lässt. Macht man das, steht der aktuelle Userguide auf deiner Domain unter /userguide zur Verfügung.
Fazit
Kohana 3 richtet sich derzeit, speziell wenn man die aktuelle “Dokumentaionslage” in Betracht zieht, klar an Framework-Interessierte User mit PHP5 und OOP Erfahrung. Ist diese Voraussetzung gegeben, ist Kohana 3 ein Werkzeug, mit welchem man sehr schnell sehr produktiv sein kann. Möglich machen das vor allem der Klassen-Auto-Loader, das kaskadierende Dateisystem, der URL basierende Controller sowie die einfache Erweiterungsfähigkeit mit Fremd-Libaries. Nicht zu vergessen die einfache Installation, Kohana 3 ist in wenigen Minuten mit samt seinen Möglichkeiten startklar.