Frei wählbare Startseite; Standarddateien waren lokal unerreichbar
Eine Quelle entscheidet jetzt, welche Seite unter / antwortet: SiteSettings::homePath() und publicPath(). Das Literal home kommt im Anwendungscode nicht mehr vor - öffentliche Routen, Canonical, Sitemap, llms.txt, Menüauflösung, Beitragslisten und der Formularrücksprung benutzen dieselben zwei Methoden. Die gewählte Seite muss veröffentlicht und nicht im Papierkorb sein, ihre eigene Adresse leitet dauerhaft auf /, und als Wurzel ist sie gegen Umbenennen und Papierkorb gesperrt. Zweiter echter Fehler, den nur ein HTTP-Aufruf zeigt: /sitemap.xml, /robots.txt, /llms.txt und /feed.xml waren lokal nie erreichbar. Der eingebaute PHP-Server antwortet für fehlende Pfade mit Dateiendung selbst mit 404, ohne den Frontcontroller zu fragen; alle Kernel-Tests bestanden trotzdem, weil sie die Anwendung direkt aufrufen. bin/dev-router.php bildet die Rewrite-Regel des Hostings nach, Start- und CI-Befehl nutzen es, und die Browserprüfung ruft die vier Adressen jetzt über HTTP auf. Barrierefreiheitsbefunde werden nach Ursache getrennt: ein Kontrastfehler aus Theme oder Stylesheet bleibt ein Defekt und bricht den Lauf ab, einer aus einer im Editor gesetzten Blockfarbe wird bei jedem Lauf mit Seite, Farbe und Verhältnis genannt und in reports/browser.json geschrieben, färbt aber keinen Codewechsel rot. Geprüft: 162 PHP-Tests / 636 Assertions unter PHP 8.2.12 und 8.4.22, 15 JavaScript-Modelltests, vollständiger Editortest mit axe, wieder grüne öffentliche Browserprüfung und Lighthouse mit je drei Läufen mobil und Desktop, alle fünf Kategorien 100. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6afad30956
commit
33e4ac0c54
21 files changed
+266
-49
No files matched your search
@@ -12,7 +12,7 @@ final class PageRepository
|
||||
public const RESERVED_SLUGS = ['admin', 'media', 'assets', 'favicon', 'kategorie', 'schlagwort', 'feed', 'beitraege'];
|
||||
public const MAX_DEPTH = 4;
|
||||
|
||||
public function __construct(private Connection $db, private DocumentValidator $validator)
|
||||
public function __construct(private Connection $db, private DocumentValidator $validator, private SiteSettings $settings)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -94,11 +94,10 @@ final class PageRepository
|
||||
if ((int) $page['version'] !== $expectedVersion) {
|
||||
throw new StaleWrite('Die Seite wurde inzwischen geändert. Lade die Übersicht neu.');
|
||||
}
|
||||
if ('home' === $page['path']) {
|
||||
// The path 'home' is assumed as the site root in several places (public routing, canonical,
|
||||
// sitemap, llms.txt, menu resolution). Making it configurable is its own step; until
|
||||
// then the start page keeps its address rather than half of the system following it.
|
||||
throw new InvalidPage('Die Startseite behält ihre Adresse. Eine andere Seite als Startseite zu wählen ist noch nicht möglich.');
|
||||
if ($page['path'] === $this->settings->homePath()) {
|
||||
// The root answers at "/". Renaming it would move the whole site to a new address,
|
||||
// which is a settings decision, not an editing one.
|
||||
throw new InvalidPage('Diese Seite ist die Startseite. Wähle unter Einstellungen zuerst eine andere Seite als Startseite.');
|
||||
}
|
||||
|
||||
$newPath = $slug;
|
||||
@@ -169,8 +168,8 @@ final class PageRepository
|
||||
if ((int) $page['version'] !== $expectedVersion) {
|
||||
throw new StaleWrite('Die Seite wurde inzwischen geändert. Lade die Übersicht neu.');
|
||||
}
|
||||
if ('home' === $page['path']) {
|
||||
throw new InvalidPage('Die Startseite kann nicht in den Papierkorb.');
|
||||
if ($page['path'] === $this->settings->homePath()) {
|
||||
throw new InvalidPage('Die Startseite kann nicht in den Papierkorb. Wähle unter Einstellungen zuerst eine andere Seite als Startseite.');
|
||||
}
|
||||
|
||||
return $this->db->executeStatement(
|
||||
|
||||
Reference in new issue
Block a user