borisbaer: PHP-Router mit Attributen: Automatisches Registrieren und Cachen von Controller-Klassen

Beitrag lesen

Hallo Rolf,

Guck mal auf der RecursiveDirectoryIterator -Seite das Beispiel von Thriault an.

das hat mir leider keine Ergebnisse geliefert. Ich hatte es genauso kopiert und auf mein Verzeichnis angewandt. Auf andere Weise (siehe oben) habe ich es aber hinbekommen.

Ich bezweifle aber, dass es sinnvoll ist, die Controller in Unterverzeichnisse zu sortieren und damit die Klassen-Instanziierung zu erschweren. Warum packst Du nicht alle Controller in einen Ordner? Sind es so viele dass es unübersichtlich wird?

Es könnten schon so um die 30 ControllerKlassen werden. Inwiefern wird die Instanziierung dadurch erschwert? Ich habe z.B. „tatsächliche“ Seiten (mit GET-Request) wie Home, Spiele, Plattformen usw. von ich nenne sie mal user-related Controllern wie SignInController, SignUpController und SignOffController getrennt. Dann haben manche Seiten auch noch Unterseiten, z.B. kann die konkrete Spiele-Seite in Releases, Merchandise, Emulation, Map usw. aufgeteilt sein. Diese Unterseiten haben jeweils eigene Controller und die stecke ich auch zusammen in ein entsprechendes Unterverzeichnis. Für mich ist es so übersichtlicher als alle Controller in einem Ordner zu haben.

Du könntest Dir auch ein Namensschema überlegen, das deine Directorystruktur abbildet. Wenn Du im Controller-Ordner einen Ordner base hast und darin einen Controller Foo.php, dann könnte der Controller in der URL den Namen base_foo tragen. Dadurch weißt Du, wo Du suchen musst.

Könnte man machen, aber ich sehe hier ehrlich gesagt keinen großen Nutzen für mich.

Ein Caching würde ich nicht empfehlen. Statt dessen solltest Du über ein separates Script, das nicht auf der Seite verlinkt ist und was Du nach Bedarf abrufen kannst, eine Referenzdatei erzeugen. Dabei handelt es sich um ein PHP Include, das ein Array dieser Art erzeugt:

$controllerRef = [
   "Foo" => "base/foo.php",
   "Game" => "games/game.php",
   "Dialog" => "ui/dialog.php",
];

Diese Datei prüfst Du im Router auf Existenz und includest sie, wenn sie da ist. Wenn Du das $controllerRef Array hast, arbeitest Du damit im Classloader. Wenn nicht, verwende die rekursive Dateisuche.

Das ist eine interessante Idee, aber ich verstehe nicht was du meinst, wenn du sagst, ich soll damit im Classloader arbeiten. Dieses Autoload habe ja installiert, aber inwiefern kann ich das verwenden, um nicht cachen zu müssen. Ich kenne mich damit leider nicht aus.

Schreibe Dir ein Utility-Script, das Dir aus deinem Controller-Ordner die Include-Datei generiert. Pflege sie nicht von Hand. Die generierte Include-Datei lädst Du dann bei jeder Codeveröffentlichung mit auf den Server.

Ja, da ich die Controller-Verwaltung automatisieren möchte, bietet sich das auf jeden Fall an.

Der Opcache der Zend-Engine sorgt dafür, dass diese Include-Datei nur einmal von PHP compiliert werden muss. Danach steht sie im Opcache binär zur Verfügung und es kostet keine merkliche Zeit, sie zu laden.

Von so was habe ich leider keine Ahnung, aber wenn ich dich hier richtig verstehe, dann kommen inkludierte Dateien bei PHP sowieso automatisch in einen Cache?

Du könntest Dir auch ein PHP Script schreiben, das auf deinem Testsystem läuft und das mit den FTP-Funktionen von PHP automatisch deinen Code auf den öffentlichen Server lädt und sich dabei auch um das Generieren der Include-Datei kümmert.

FTP und PHP. Ist leider noch zu hoch für mich. 🤔

Was ich nicht empfehlen würde, ist, die include-Datei von deinem regulären PHP Code "on demand" erzeugen zu lassen. Ein öffentlich erreichbares PHP Script sollte niemals dorthin schreiben dürfen, von wo Code ausgeführt werden kann.

Was ist die Alternative? „Schreibe dir ein Utility-Script“ hast du oben geschrieben. Meinst du damit eine Art Helfer-Funktion? Könntest du da etwas konkreter werden. Du weißt ja, ich bin kein Fachmann. ^^

Grüße
Boris