Hi!
Die index.php ist die einzige ausführbare Datei, die direkt mittels HTTP aufgerufen werden kann. Dies wird mittels .htaccess-Direktiven ermöglicht.
In dieser Datei wird lediglich der Bibliotheks-Pfad in den PHP-Include-Path integriert,
Geht das nicht bereits in der Grundkonfiguration von PHP oder in einer Per-Verzeichnis-Konfiguration (.htaccess bei mod_php, .user.ini für CGI ab PHP 5.3.0)?
die Entwicklungsumgebung als Konstante definiert
Was willst du damit bezwecken? Soll das ein abfragbares Flag sein, ob Debug-Code ausgeführt werden soll, wenn du gerade am Entwickeln bist, nicht jedoch im Produktivsystem?
Diese Basis-Klasse besteht im Wesentlichen aus drei Teilen:
- Der Konstruktor: Hier werden alle für die Anwendung zwingend erforderlichen Aufgaben durchgeführt (wie z.B. das Auslesen der Config-Datei, Initialisierung des Autoloaders und Fehlerbehandlung, etc.)
Durchgeführt oder angestoßen? Monster-Methode oder Aufrufe spezialisierter Methoden?
- Der Bootstrap-Prozess: Hier werden alle Aufgaben ausgeführt, die für die allgemeine Anwendung nicht zwingend sind, für die speziellere aber schon. Hierzu zählt beispielsweise die Authentifizierung und Autorisierung sowie das weitere Laden von Plugin-Klassen.
Woher weißt du denn zu dem Zeitpunkt schon, ob eine Authentifizierung überhaupt notwendig ist und wenn ja, wofür man autorisiert sein muss?
- Der Start-Prozess: Hier wird die "eigentliche Anwendung" gestartet. Sprich: Der Front-Controller wird aufgerufen, welcher dann als oberste Instanz die weiteren Aufgaben an die anderen "normalen" Controller delegiert.
Und nachdem der Action-Controller tätig, was passiert dann? Führt der Action-Controller auch die View aus oder gibt er eine fertig präparierte View zurück, die der Front-Controller dann ausführt? Letzeres ist zum Beispiel für TDD sinnvoll. Ein Action-Controller kann besser getestet werden, wenn er ein View-Objekt mit einzeln prüfbaren Daten zurückgibt statt einer fertigen Textwurst oder einer bereits erfolgten Ausgabe.
Meine Verzeichnisstruktur ist "stur" nach MVC ausgerichtet, es gibt also Module-Ordner, die dann Model-, View-, Controller-, Config-, Layout-Ordner oder ähnliches enthalten. Innerhalb dieser Ordner (Anmerkung: Genauso auch in der Bibliothek) steht jede Klasse in einer eigenen Datei.
Was am Ende sinnvoll und praktisch ist und was nicht, wirst du im Laufe der Zeit als Erfahrung sammeln. Auch - und das ist der entscheidende Punkt, um deine gesamte Absicht bewerten zu können - kommt es auf das konkrete Ziel an. Willst du nur mal üben oder ein konkretes (wichtiges) Projekt realisieren?
Zusätlich zur Bibliothek und zur Anwendung gibt's bei mir noch einen Ordner "public", der die zuvor beschriebe index.php und - in Ordnern sortiert - statische Dateien wie Bilder, JavaScripts, CSS und so weiter enthält.
Was ist das für eine Bibliothek? Eine selbst erstellte oder eine von der Stange - welche?
Soviel zu meiner aktuellen Vorgehensweise. Jetzt meine Fragen an Euch:
- Was haltet Ihr von OOP (speziell im PHP-Kontext)?
Kommt auf die Aufgabenstellung und das abzuschätzende Verhältnis zwischen Aufwand und Nutzen an.
- Was haltet Ihr von MVC?
- Wie baut Ihr Eure Anwendungen auf?
Kommt auf Art und Umfang der Anwendung an. Wenn ich ein ASP.NET-Projekt erstelle, führt quasi kein Weg an ASP.NET MVC vorbei, wenn ich nicht gerade den an die Desktop-Programmierung angelehnten herkömmlichen ASP.NET-Ansatz mit fertigen Komponenten mit teilweise schrecklichem HTML-Code als Ergebnis sowie ereignisgesteuerter Programmierung gehen will.
Wenn das Ziel eine Website in der Größenordnung für Kleinunternehmer oder kleine Hobbyunternehmungen ist - ein paar Seiten und etwas Schnickschnack - also bei Projekten, wo man die Übersicht über die verwendeten Variablen und dergleichen noch im Kopf behalten und auch nach einer Pause schnell wiedererlangen kann - reicht mir oft die Aufteilung nach EVA. Da ist die index.php selbst das Gegenstück zum Front-Controller, der schon selbständig 0815-Seiten erstellen kann. Und wenn eine Aktion was besonderes benötigt, kommt eine Funktion hinzu, die quasi die Aufgabe der Action im Action-Controllers übernimmt.
Damit wäre dann zwischen den Zeilen auch die erste Frage beantwortet. MVC ist eins von vielen Lösungsmustern. Solche Patterns beschreiben den Weg zum Ziel und nicht konkret, wie die Implementierung aussehen soll. Das MVC-Pattern kann man also auch anwenden, ohne dass man mehr oder weniger buchstabengetreu Model-Klassen, View-Klassen und Controller-Klassen erstellt. Und man kann von diesem Prinzip abweichen, wenn man es für sinnvoll hält.
Beispielsweise kann man die ganze Angelegenheit um View-Models ergänzen. Mitunter will man in der View mehr Daten darstellen, als das eigentliche Model liefert, oder man muss mehrere Models befragen, um alle Daten zu bekommen. Dann kann man sich ein View-Model erstellen, in das der Controller alle benötigten Daten vereint. Oder aber, das Model ist zu umfangreich im Hinblick auf die Daten, die es liefern kann oder den Funktionsumfang, den man auch noch aus der View heraus missbrauchen könnte, wenn man selbiger eine Referenz aufs Model übergibt. Dann kopiert man nur die benötigten Daten ins View-Model, um der View oder dem View-Ersteller nicht mehr Angriffsfläche als nötig zu bieten.
- Was kommt bei Euch in den Initialisierungs-, was in den Bootstrap-Prozess?
Alles notwendige, aber möglichst nichts überflüssiges. Konkreter kann ich das ohne Kenntnis des Ziels nicht beantworten.
- Arbeitet Ihr mit einem Front-Controller? Und wenn ja, wie verwendet Ihr ihn?
Die Frage hört sich so an, als ob du dir selbst das MVC-Framework stricken willst. Du musst dir überlegen, welche Aufgaben du welcher Komponente geben willst, wie aufwendig die jeweiligen Teilaufgaben sind und ob man die nicht besser in noch weiter spezialisierte Konstrukte bringt (reicht eine Methode oder wäre eine eigene Klasse besser?).
Der Front-Controller muss ja auch die Zuordnung zwischen URL und der Action im Action-Controller herstellen. Hast du in deiner URL ein starres Prinzip, dann kann der Front-Controller daraus recht einfach das Ziel ableiten. Oder kann sie beliebig viele Elemente haben, dann wäre ein Router, der einen Satz Regeln auf Treffer prüft, eine Lösung. Oder man macht es universell verwendbar, indem man einen einfachen Router für den einen Fall und einen komplexeren für den anderen Fall einbinden kann.
Lo!