Rolf ẞ: Funktional oder Klassenbasierend bei Konfiguration & Initialisierung im PHP Framework?

Beitrag lesen

Hallo MB,

ein richtiges PHP Großprojekt habe ich noch nicht gemacht - ich beschäftige mich "nur" mit der Umstellung eines Alt-Projektes auf OO-Standbeine. Das Ding ist von 2003 und sieht vom HTML und PHP entsprechend aus. Ich mache das seit 3 Jahren in meiner Freizeit, mit langen Auszeiten, nicht beruflich.

Mein Vorgehen war zunächst hybrid, d.h. ich habe den ganzen Rahmencode prozedural gelassen und mir Worker-Klassen geschrieben, die bestimmte Teilfunktionen abgebildet haben. D.h. ich habe bei Bedarf einen solchen Worker erzeugt und Methoden darauf genutzt.

Das hat sich ausgeweitet, bis ich irgendwann so weit war, den prozeduralen Teil weitgehend zu eliminieren (der war nämlich redundant in allen PHP Seiten drin). Jetzt habe ich eine Klasse für den Session-Handler, für den Router, eine Utility-Klasse für statischen Krimskrams, und eine "Context" Klasse, die letztlich den Rahmen für eine Request-Abarbeitung bildet. Mein "Hauptprogramm" ist noch ein klein wenig prozedural; ich erzeuge die Context-Klasse und stecke ihr ein paar Helper dazu (einen Logger, den Router, die SQL Access Factory und solche Dinge) und rufe dann nur noch sowas auf wie context->handleRequest().

Den ersten Nutzen von der Bausteintechnik hatte ich Anfang des Jahres. Das Projekt läuft noch mit mysql, und ich muss natürlich weg davon. Ich habe eine zweite SQL Factory geschrieben, die alle Zugriffe über PDO laufen lässt, und kann nun schrittweise die Repositories (also die Klassen, die DB-Zugriffe nach Fachdomäne bündeln) von der einen auf die andere SQL Factory umstellen. Bedeutet natürlich, dass ich nach Möglichkeit KEIN SQL selbst schreibe, sondern von der Factory erzeugen lassen. Nach Möglichkeit. Manchmal muss es eben doch...

Konfiguration steckt zur Zeit in einer settings.php, prozedural, weil noch nicht alle Seiten der Anwendung auf MVC umgestellt sind. Meine Context-Klasse kopiert die dort angelegten Werte in Instanzvariablen des Kontexts bzw. stellt sie den angeschlossenen Helpern zur Verfügung (z.B. DB-Credentials für die SQL Factory).

Die handleRequest Methode bedient sich des Routers, um zur URL den passenden Controller und die passende Action zu finden. Ich arbeite mit Convention-Mapping und unterstütze überhaupt keine Routing Configuration, d.h. wenn die URL einen Controller Foo und eine Aktion Bar beschreibt, suche ich im Controller-Ordner ein FooController.php, lade das, erzeuge den Controller und rufe darauf die Methode Bar() auf. Ein besseres Framework müsste mehrere Ordner kennen, in denen Controller liegen können, und ggf. einen flexibleren Parser für Routen. Bisher brauchte ich das nicht, mein Schema ist immer foo/controller/action/parameter1,parameter2,... - und foo ist mein Hauptprogramm foo.php, der Apache ruft das einfach auf, ohne URL Rewriting. D.h. meine Anwendung läuft als http://example.org/foo/controller/action/…

Wenn nach foo Schluss ist, habe ich einen Defaultcontroller (start), und wenn keine action angegeben ist, rufe ich die Defaultaction (index) auf. Und foo.php ist die Default-Seite des Web, d.h. rufst Du http://example.org auf, landest Du bei foo.php mit Controller=start und Action=index.

Viel zu konfigurieren ist da gar nicht :)

Wenn Du Dinge konfigurieren musst, dann schau Dir an, wie weit diese Konfigurationsdaten eine Datenstruktur bilden. Ist keine da, mach einfach ein Array als key->value Dictionary. Ist aber was da, dann bau es adäquat auf, als Array, mit Subobjekten, einfach so, dass es zur Struktur der Daten passt. Lass dich bei einer Liste von ähnlichen Werten nicht darauf ein, ein Array mit Schlüsseln wie "fup_1", "fup_2", "fup_3", "fup_count" zu bauen, sondern mach ein einziges Property "fup" und bau es als Array auf. Natürlich musst Du Dir überlegen, wie Du das in deiner Konfigurationsdatei hinterlegst - aber es spricht NICHTS dagegen, eine von Dir gepflegte Konfiguration als config.php zu schreiben und dort die benötigte Datenstruktur zusammenzubauen. Ein .ini-Format, wie die php.ini, ist nicht das Beste. Du kannst auch eine XML Darstellung wählen, ein JSON Format oder eine YAML Datei. Wird alles von PHP unterstützt.

Rolf

--
Dosen sind silbern