Facebook
Twitter
Google+
Kommentare
17

Kohana PHP Framework

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:

  1. Application Pfad
  2. Module Pfad
  3. 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.

Über den Autor

Daniel Schweiger

Kommentare

17 Comments

  1. Der Titel ist falsch, das Teil heisst Koh_a_na. 🙂

    Ich finde Kohana 3 ein interessantes Konzept: Das Framework selber ist, wenn man will, mehr oder weniger ein glorifizierter Autoloader.

    @Flyingmana: Keine Ahnung, ich frage mal im Kohana-Forum nach.

    Reply
  2. Hört sich sehr vergleichbar zum Zend Framework an. Gibt es Infos zur Kompatibilität? Also die Möglichkeit, beide zusammen zu verwenden? Oder geht die Empfehlung doch mehr in die Richtung, sich für eines der beiden zu entscheiden?

    Es heißt übrigens „benutzt“ und nicht „benützt“.

    Danke für den ausführlichen Artikel. Ich habe von diesem Framework bis dato noch nichts gehört. Es klingt auf jeden Fall sehr interessant und scheint Dinge, die mich beim Zend Framework extrem aufregen, wesentlich besser zu machen.

    Reply
  3. Nachtrag:

    $user = ORM::factory(‘user’); // lädt alle user

    Das ist nicht richtig, es erstellt ein leeres Benutzer-Object, welches mit Daten gefüllt und gespeichert werden kann. Alle Benutzer bekommt man mit

    ORM::factory(‚user‘)->find_all();

    Reply
  4. mich würde ein Vergleich zu cakePHP interessiert. Wo die Unterschiede und Vor/Nachteile der beiden Möglichkeiten liegen

    Reply
  5. hallo zusammen,

    @dyron:

    danke für die korrektur zum falschen comment

    @marcel:

    mit cake habe ich mich leider noch nicht näher auseinandersetzen können, jedoch was ich dazu sagen kann ist das cake dem OOP gedanken nicht so nahe kommt wie kohana. cake läuft ab PHP 4.3.2

    pluspunkte für:

    dokumentaion, freundlich große community, viele erweiterungen

    negativpunkte für:

    performance, nicht so light-weight, nicht so schnell am start wie eine kohana umgebung, umständlicher im erweitern von core funktionen

    @nils:

    gerne 🙂

    vg,
    daniel

    Reply
  6. grade die cakephp install is doch das simple … nur 1 config file editieren und die daten für die db eintragen und fertig

    Reply
  7. Die Herausgeber von PHP Frameworks sollten sich in erster Linie um gutes Klassendesign kümmern. Leider habe ich noch kein PHP Framework gefunden, dass ich als „gut“ einstufen könnte. Stattdessen sind die Einarbeitungszeiten jedesmal sehr hoch, weil entweder dem PHP Magic nicht wiederstanden werden konnte oder weil DI nicht umgesetzt wurde. Stattdessen implementiert man massenhaft Singletons und wickelt alles Sonstige über statische Methoden ab. Oft gehen Klassen über 1000 Codezeilen hinaus. Von dem „Clean Code“ Buch haben die Autoren solcher Frameworks scheinbar bisher auch immer Abstand gehalten. Ich habe mit CakePHP, ZF und Doctrine gearbeitet und war jedesmal nicht sonderlich begeistert. Die Ideen hinter diesen Frmeworks sind zweifelsfrei wirklich gut, aber die Umsetzung ist weniger gut und nicht Entwickler-freundlich.

    Reply
  8. Hi,

    mal eine Frage an den Autor des Artkels.
    Ich habe ein Problem mit den Routes.

    Hier wird example.com/hilfe aufgerufen. Wenn man jedoch example.com/help aufruft, kommt man zur gleichen Seite. Kann man das irgendwie verhindern? Ich möchte, das die Seite nur unter der deutschen URL erreichbar ist

    Route::set(‚hilfe‘, ‚hilfe(/)‘)
    ->defaults(array(
    ‚controller‘ => ‚help‘,
    ‚action‘ => ‚index‘,
    ));

    Route::set(‚default‘, ‚((/(/)))‘)
    ->defaults(array(
    ‚controller‘ => ‚welcome‘,
    ‚action‘ => ‚index‘,
    ));

    Reply
  9. @Alex:

    Deine Standard-Route übersetzt example.com/help in controller => help und action => index, was deiner ‚hilfe‘-Route entspricht.

    Entweder eine eigene Route Route::set(‚help‘, ‚help‘)->defaults(array(…)); und natürlich nicht help/index vergeben, da es ja schon die deutsche Hilfe beinhaltet oder den Controller zur deutschen Hilfe in ‚hilfe‘ umbenennen und in ‚help‘ den englischen Inhalt hinterlegen.

    Reply
  10. Hi kurze frage ist das nicht wiedersprüchlich:

    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)); <—das hier
    }
    return $result;
    }

    wenn ich schon variablen definiere dann sollt ich sie in der funktion vlt. auch verwenden oder??

    lg

    Reply
  11. @Thomas,

    wieso widersprüchlich (schreibt man mit kurzem i)?
    $count ist ja mit 3 (falls nichts übergeben) vordefiniert.

    wenn ich 8 will geb ichs halt mit 🙂

    vg

    Reply
  12. Es ging ihm wohl eher darum das $type per default auf ‚alnum‘, und $length auf 8 gesetzt werden, diese Variablen im Code aber gar nicht benutzt werden, sondern hart codierte Werte (eben ‚alnum‘ und 8) verwendung finden.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen