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

Beitrag lesen

Hallo borisbaer,

ja, ein RecursiveDirectoryIterator ermöglicht das, zusammen mit einm RecursiveIteratorIterator.

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

Alternativ kannst Du auch selbst eine rekursive Suche implementieren, aber die Iteratoren machen es einfach.

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?

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.

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.

Auf deinem Test-Web lässt Du diese Include-Datei weg und arbeitest mit der rekursiven Suche. Für das Test-Web ist das okay.

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.

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.

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.

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.

Rolf

--
sumpsi - posui - obstruxi