Tag 2 · Block 3 · BK2 · CRUD-Operationen

Routing mit plain PHP

Das Wichtigste

📖 Lies zuerst im Handout: Handout Tag 2 · Block 3 · Inhalt, Abb. 2.3 und 2.4. Die Aufgaben prüfen, ob du es verstanden hast – nicht, ob du es findest.

Teil 1 · Verstehen

1

Welcher Pfad kommt raus?

Was steht nach diesen zwei Zeilen in $path?

$path = rtrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
if ($path === '') { $path = '/'; }

📖 Nachlesen: Handout Tag 2 · Block 3 · Inhalt und TIPP (Trailing-Slash)

$path
REQUEST_URI = /kurse/all?filter=aktiv
REQUEST_URI = /kurse/42/
REQUEST_URI = /kurse/all/?x=1
REQUEST_URI = /
2

Regex lesen

Passt der Pfad auf #^/kurse/(\d+)$#? Und was steht dann in $m[1]?

📖 Nachlesen: Handout Tag 2 · Block 3 · Inhalt (Regex) und ACHTUNG

passt?$m[1]
/kurse/42
/kurse/abc
/kurse/42/details
/api/kurse/42
/kurse/007
3

Router vorhersagen

Welcher Arm greift, und welchen Statuscode bekommt der Client? Es gibt die Kurse 1–6.

match (true) {
    $method === 'GET' && $path === '/kurse/all'
        => handleGetAllKurse(),
    $method === 'GET' && preg_match('#^/kurse/(\d+)$#', $path, $m) === 1
        => handleGetKursById((int) $m[1]),   // 404, wenn es den Kurs nicht gibt
    default => handleNotFound(),
};

📖 Nachlesen: Musterlösung `tag2-block3` · `public/index.php`; Handout Tag 2 · Block 3 · Akzeptanzkriterien

ArmStatus
GET /kurse/all
GET /kurse/3
GET /kurse/9999
GET /unbekannt
GET /kurse/all/
GET /kurse/abc
POST /kurse/all
4

Reihenfolge von Header und Ausgabe

Welchen Statuscode bekommt der Client?

echo json_encode(['error' => 'Kurs nicht gefunden']);
http_response_code(404);

📖 Nachlesen: Handout Tag 2 · Block 3 · MERKE (Header vor echo)

5

Fehler im Handout finden

Im Handout (Abb. 2.3) steht dieser default-Arm. Warum läuft der Code so nicht?

default => (
    http_response_code(404) &&
    echo json_encode(['error' => 'Route nicht gefunden'])
),

📖 Nachlesen: Handout Tag 2 · Block 3 · Abb. 2.3; Musterlösung `tag2-block3`

6

Apache statt JSON

curl http://localhost:8080/kurse/all liefert eine HTML-Seite «Not Found» von Apache statt JSON. Was ist die Ursache?

📖 Nachlesen: Handout Tag 2 · Block 3 · Inhalt (.htaccess) und MERKE

Teil 2 · In deinem Projekt

Lab 2.3 – Router für GET /kurse/all und GET /kurse/{id}

Erst wenn Teil 1 erledigt ist. Dann hast du alles, was du dafür brauchst.

Arbeite allein in deinem eigenen Projekt. Der Walkthrough im Handout ist deine Notfall-Hilfe – versuch es zuerst ohne.

Im Starter-Projekt ist mod_rewrite schon im Dockerfile aktiviert, der PHP-Service heisst php.

  1. Lies REQUEST_METHOD und REQUEST_URI aus und extrahiere mit parse_url() nur den Pfad.
  2. Baue den Router mit match(true) – eine Route pro Arm, default für 404.
  3. Verdrahte getAllKurse() und getKursById($id) in die Handler.
  4. Erstelle public/.htaccess mit der Umleitung auf index.php.
  5. Prüfe, ob mod_rewrite aktiv ist: docker compose exec php apache2ctl -M | grep rewrite.
  6. Teste alle Fälle mit curl und prüfe die Statuscodes (curl -i …).

Akzeptanzkriterien – hake ab, was bei dir läuft

Zum Schluss: committen und pushen

git add .
git commit -m "feat: Router für GET /kurse/all und /kurse/{id} (Lab 2.3)"
git push