Codeigniter Framework ohne ‚Ausgaben‘ nutzen

Codeigniter (CI) ist ein nettes, leichtgewichtiges PHP Framework. Es implementiert das Model-View-Controller (MVC) Design-Pattern und bietet eine ganze Reihe hilfreicher Funktionen, wie z.B. die Validierung von HTML-Formularen.

Im Falle einer schrittweisen Projekt-Migration nach CI erhebt sich die Frage, wie setzt man CI ein, ohne ein komplettes Redesign zu machen. Beabsichtigt man eine solche, so wird man neuen Code z.B. als „Model“-Klassen implementieren oder als Libraries und will darin natürlich das neue Framework benutzen. Später dann, bei den folgenden Migrations-Schritten, kann man in neuen – dann CI basierten – Controllern die eigenen „Modelle“ gleich wieder verwenden.

Lösung

Man schaue sich einmal die Funktion _fetch_uri_string() der Klasse libraries/CI_URI an. Dort sieht man wie CI versucht die „Segmente“ hinter dem EINEN Skript-Aufruf von index.php zu ermitteln. In Version 1.7.2 wird dort zuerst versucht, das $_GET-Array auszuwerten. Wenn das nicht funktioniert, wird $_SERVER[‚PATH_INFO‘] ausgewertet. Und genau das machen wir uns zu Nutzen.

Wenn CI genutzt werden soll ohne Ausgaben zu erzeugen, schreiben wir uns einen stub-Controller und speichern ihn unter application/controllers/Stub.php ab. Er sieht minimal so aus:

class Stub extends Controller {
    function index() {}
}

Dieser stub-Contoller lädt keinen View, erzeugt also keine Ausgabe. Und da CI sauber programmiert ist, erzeugt es wirklich keine Ausgaben (header() redirect ist später ohne Problem möglich).

In unserem Skript, in welchem wir das Framework nutzen wollen, schreiben wir dann:


unset($_GET); // die Übergabe-Parameter müssen zuvor ausgewertet sein
$old = $_SERVER['PATH_INFO'];
$_SERVER['PATH_INFO'] = "/stub";
require("index.php");
$_SERVER['PATH_INFO'] = $old;

index.php ist das Hauptsskript von CI. Durch diese Einbindung wird das Framework vollständig initialisiert. D.h. wir können es in unserem Skript nutzen. Anstelle von $this->… müssen wir dann nur $CI->… schreiben. Denn die Instanz steht nach dem require(); zur Verfügung.

Vielleicht denkt man nun, was ein Wahnsinn, das ganze Zeugs zu inkludieren… Nein, CI hat wirklich nur einen kleinen Footprint und bei etwas größeren Projekten inkludiert man sowieso oft mehr als ein Dutzend Dateien ins eigen Skript.

Schreibe einen Kommentar

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