Frameworks und Doctrine – Kohana

Sowohl Kohana als auch DooPHP bringen ihre eigenen Datenbank und ORM-Module mit, deren Benutzung ich allerdings erst erlernen müsste. Die können sich vom Funktionsumfang aber beide nicht mit Doctrine messen und in Doctrine hatte ich mich ja schon ein klein wenig eingearbeitet, so dass für mich die Entscheidung ganz klar für Doctrine fällt. Verständlicherweise findet man in den offiziellen Dokumentationen der Frameworks keinerlei Tutorials für die Einbindung von Doctrine. Schließlich gehen die Entwickler ja davon aus, dass man die mitgebrachten Module benutzt. Daher ist man hier auf die Hilfe der Community angewiesen oder man muss sich selber einen Weg ausdenken, Doctrine in die Framework-Umgebung zu bekommen.

Im Falle von Kohana hat man Glück und man findet im Forum ein Posting, wie ein User Doctrine bereits in das Framework als Modul eingebunden hat:

  • Zuerst erstellt man sowohl im Verzeichnis „modules“ als auch „system/classes/“ ein Unterverzeichnis namens „doctrine“.
  • Den Inhalt des „lib“ Verzeichnisses aus dem Doctrine-Download, also die „Doctrine.php“ und die Verzeichnisse „Doctrine“ und „vendor“, kopiert man dann nach „system/classes/doctrine“.
  • Für die Zugangsdaten der Datenbankverbindung erstellt man eine einfache PHP-Datei in „application/config/“ namens „database.php“:
    [sourcecode lang=“php“]
    return array(
    ‚doctrine‘ => array(
    ‚user‘ => ‚USER‘,
    ‚password‘ => ‚PASSWORD‘,
    ‚host‘ => ‚HOST‘,
    ‚database‘ => ‚DATABASENAME‘,
    )
    );
    [/sourcecode]
  • Dann erstellt man eine „init.php“, die ins „modules/doctrine“ Verzeichnis kommt. Dies wäre die Basis-Version, die man dann an die eigenen Bedürfnisse anpassen müsste:
    [sourcecode lang=“php“]
    require Kohana::find_file(‚classes‘, ‚doctrine/Doctrine‘);
    spl_autoload_register(array(‚Doctrine‘, ‚autoload‘));
    spl_autoload_register(array(‚Doctrine‘, ‚modelsAutoload‘)); // Wichtig, damit die Tabellen-Module richtig geladen werden!

    $db = Kohana::config(‚database‘)->doctrine;

    $manager = Doctrine_Manager::getInstance();
    $manager->connection(‚mysql://‘.$db[‚user‘].‘:‘.$db[‚password‘].’@‘.$db[‚host‘].’/‘.$db[‚database‘], ‚doctrine‘);
    $manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);

    Doctrine::loadModels(APPPATH.’models‘);
    [/sourcecode]

  • In der bootstrap.php von Kohana (zu finden im application Ordner) fügt man Doctrine der Liste der zu ladenden Module hinzu:
    [sourcecode lang=“php“]
    Kohana::modules(array(

    ‚doctrine‘ => MODPATH.’doctrine‘, // Doctrine ORM

    ));
    [/sourcecode]

Damit wäre die Arbeit erledigt und ich kann das „Hello World“ Skript mit folgenden Zeilen erweitern, um den Namen des Tonträgers mit der ID 1 auszulesen und im Template anzuzeigen:
[sourcecode lang=“php“]
$medium = Doctrine_Core::getTable(‚Medium‘)->find(1);
$this->template->title = $medium->mName;
[/sourcecode]

Im Template dann:
[sourcecode lang=“php“]

Tonträgertitel:

[/sourcecode]
Das funktioniert dann auch einwandfrei. Wie allerdings zu erwarten, sank beim nachfolgenden Apache Benchmark die Zahl der Request dann doch deutlich:

ohne Doctrine + Datenbankabfrage: 56,14 Requests pro Sekunde
mit Doctrine + Datenbankabfrage: 37,21 Requests pro Sekunde

Man muss allerdings auch berücksichtigen, dass mit Doctrine ein nicht ganz kleines Softwarepaket eingebunden wird. Auch werden hier die Möglichkeit des Cachens von Daten und andere Optimierungen noch völlig ignoriert werden. Und für den Produktivbetrieb werden auf der Doctrine-Homepage einige nützliche Tipps gegeben, die Performance etwas zu verbessern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.