Florian Herlings, freier Webentwickler aus Düsseldorf.

Rapid database prototyping mit Codeigniter und RedBeanPHP

Prototypische Designprozesse respektive Prototyping im Allgemeinen sind im UI-/UX-Design-Bereich zurzeit in aller Munde. Auch in der Software-Entwicklung gibt es Momente, in denen man in hoher Geschwindigkeit einen Prototypen entwickeln möchte um festzustellen, ob ein auf dem Papier ausgedachtes Konzept in der Umsetzung Bestand hat.

Obwohl Ruby oft vor PHP für die Prototypen-Entwicklung herangezogen wird gibt es durchaus Tools und Libraries, die genau dies in PHP unterstützen. Meistens wird ein Prototyp erstellt, indem man ein Datenbankschema anlegt und sich per „scaffolding“ ein zwar spartanisches, aber benutzbares CRUD-Frontend generieren lässt.

Ein anderer Ansatz soll in diesem kurzen Artikel aufgezeigt werden: Es existieren Libraries welche es ermöglichen, direkt PHP-Code zu schreiben und daraus das Datenbankschema abzuleiten. Erreicht wird dies durch die Verwendung der RedBeanPHP-Library, die wiederum das Setzen von Instanzvariablen überwacht und das Datenbankschema daraus zur Laufzeit ableitet. In dem Moment, in dem die Library feststellt, dass sich etwas am Schema geändert hat, ändert diese das Schema in der Datenbank entsprechend.

RedBeanPHP und Codeigniter

Das PHP-Framework Codeigniter eignet sich meiner Meinung nach besonders für Einsteiger in PHP-Frameworks und um kleinere Webprojekte für eingeschränkte Hostingumgebungen zu realisieren. Um RedBeanPHP besonders bequem in Codeigniter zu integrieren, habe ich ein Codeigniter-Plugin geschrieben, welches es ohne Kenntnisse der RedBean-Library ermöglicht, schnell einen Prototypen der Applikation zu erstellen und daraus das Schema abzuleiten.

Das CI-RedBean-Plugin ist kostenlos und frei via github herunterzuladen. Die Installationshinweise sind in der README des Repositories enthalten und umfassen nur wenige Handgriffe. Die RedBeanPHP-Library ist in das Plugin eingebettet.

Benutzung

Nachdem man das Plugin installiert hat, kann man direkt mit der Implementierung seiner Logik beginnen. Der einzige Unterschied zur Arbeit ohne das Plugin ist, dass alle Model-Klassen von der Klasse RedbeanModel erben müssen:

/system/application/models/Car_model.php
class Car_model extends RedbeanModel { }

Da das Plugin über einen Autoloader für die Models verfügt, kann man im Controller direkt neue Instanzen seines definierten Models erzeugen und diesen Attribute zuweisen. Sobald man die save()-Methode der Model-Instanz aufruft, übernimmt die Redbean-Library und sorgt dafür, dass das Objekt so persistiert wird:

/system/application/controllers/welcome.php
class Welcome extends Controller
{
  function index()
  {
    $car = new Car_model();
    $car->manufacturer = "Opel";
    $car->model = "Admiral";
    $car->save();
  }
}

Ändert man in einem zweiten Schritt die Attribute einer Model-Instanz und ruft die save()-Methode erneut auf, ändert die Library für den Nutzer transparent das Schema in der Datenbank um die neuen Attribute mit aufnehmen zu können:

/system/application/controllers/welcome.php
class Welcome extends Controller
{
  [...]
  function change_schema()
  {
    $car = Car_model::load(1);
    $car->tires = 4;
    $car->save();
  }
}

Die Library verwaltet den gesamten Vorgang und migriert das Schema-Status gemäß der veränderten Datenstruktur. Der Programmierer muss sich um diesen Vorgang nicht kümmern und kann seine Models so benutzen, als würden sie auf magische Weise persisitiert.

phpMyAdmin-Screenshots von vor und nach der zweiten save-Operation

Weiter Informationen sind den folgenden Webseiten zu entnehmen:

Lerne mehr auf CodeScouts.de