Architektur
Eine Anfrage, vom Rewrite, der sie an index.php schickt, bis zu den Bytes, die zurückgehen.
Die Anfrage, verfolgt
Der Exception-Handler wird zuerst installiert, weil er funktionieren muss, wenn nichts anderes funktioniert hat: Er protokolliert, sendet ein schlichtes 500, wenn die Header noch nicht raus sind, und sagt dem Besucher sonst nichts.
Die Schichten
Die Abhängigkeiten zeigen in eine Richtung. Controller benutzen Services und Views, Views und Models bauen Elemente aus View\Html, und View\Html hängt von nichts darüber ab.
Die App
Eine pro Prozess, vom Autoloader der Website gebootet und mit App::current() wieder gelesen. Eine zu konstruieren tut nichts, sie zweimal zu booten heißt, sie einmal zu booten, und eine zweite App wird abgelehnt. Der tiefe Code des Frameworks — der Schlüssel und die Replay-Seriennummer der API, der Health-Report — fragt die gebootete App, statt dass jeder Konstruktor auf dem Weg nach unten die Fakten der Website mitträgt.
Die Leitung
Eine Anfrage wird defensiv geparst. Eine unbekannte Methode ist null, nicht geraten als GET, und ein Ziel, das der Parser von PHP nicht lesen kann, bleibt der Pfad, der es ist, statt mit der Startseite beantwortet zu werden. Die Security-Header sind typisierte Objekte, gesendet vor allem, was scheitern könnte, und jede Seite variiert genau nach den Headern, aus denen sie gerendert wurde.
Die signierte API
Ein Update ist ein gzip-komprimiertes Tar im Body eines einzigen POST, signiert mit einem ECDSA-P-256-Schlüssel, von dem der Server nur die öffentliche Hälfte hat. Die Signatur deckt die Aktion ab, einen Zeitstempel, eine Seriennummer, die der Server verbraucht, bevor er irgendetwas anwendet, und einen Hash des Bodys. Ein Aufruf, der nicht oder falsch signiert ist, wird genau so beantwortet wie eine Adresse, die es nicht gibt.
SPA-Navigation
Jeder Link ist ein echtes href. Navigation fängt einen Klick auf einen Link ab, der auf diesem Origin bleibt, fragt die Seite mit X-Requested-With an und tauscht die Antwort in #content ein. Ein Server mit dem Framework antwortet mit einem Fragment; ein statischer Host wie dieser antwortet mit der ganzen Seite, und nur ihr Inhalt und ihr Titel werden genommen — und, wenn die Seite in einer anderen Sprache ist, die Teile der Shell, die in der Sprache geschrieben sind, die sie ablöst.
Weiterlesen
- docs/architecture.md — die Anfrage, die App, die Schichten, Exceptions, der Markup-Baum
- docs/security.md — die Header, das Methoden-Gate, die Wächter, die API
- docs/frontend.md — der Build, das Element-Modell, die SPA-Navigation
- docs/collections.md — Collections, und was ein Array bleibt