From 8653abdeec1c2d768b106f7e1a845157ab1b1ab7 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 3 Jul 2026 08:01:29 +0000 Subject: [PATCH] R0.5: eigene Fehlerseiten 403/404/419/500/503 (self-contained, domain-aware) Bisher griffen die Laravel-Default-Seiten. Gemeinsames Inline-CSS-Layout ohne Vite-Abhaengigkeit (rendert auch bei kaputtem Asset-Build), nutzt die geteilte domainName-Variable mit Fallback, noindex, Dark-Mode via prefers-color-scheme. Co-Authored-By: Claude Fable 5 --- resources/views/errors/403.blade.php | 5 ++ resources/views/errors/404.blade.php | 5 ++ resources/views/errors/419.blade.php | 5 ++ resources/views/errors/500.blade.php | 5 ++ resources/views/errors/503.blade.php | 5 ++ resources/views/errors/layout.blade.php | 93 +++++++++++++++++++++++++ tests/Feature/ErrorPagesTest.php | 26 +++++++ 7 files changed, 144 insertions(+) create mode 100644 resources/views/errors/403.blade.php create mode 100644 resources/views/errors/404.blade.php create mode 100644 resources/views/errors/419.blade.php create mode 100644 resources/views/errors/500.blade.php create mode 100644 resources/views/errors/503.blade.php create mode 100644 resources/views/errors/layout.blade.php create mode 100644 tests/Feature/ErrorPagesTest.php diff --git a/resources/views/errors/403.blade.php b/resources/views/errors/403.blade.php new file mode 100644 index 00000000..e138d338 --- /dev/null +++ b/resources/views/errors/403.blade.php @@ -0,0 +1,5 @@ +@extends('errors.layout') + +@section('code', '403') +@section('title', 'Zugriff verweigert') +@section('message', 'Für diese Seite fehlt Ihnen die Berechtigung. Melden Sie sich mit einem passenden Konto an oder kehren Sie zur Startseite zurück.') diff --git a/resources/views/errors/404.blade.php b/resources/views/errors/404.blade.php new file mode 100644 index 00000000..bddc82f3 --- /dev/null +++ b/resources/views/errors/404.blade.php @@ -0,0 +1,5 @@ +@extends('errors.layout') + +@section('code', '404') +@section('title', 'Seite nicht gefunden') +@section('message', 'Die aufgerufene Seite existiert nicht oder wurde verschoben. Prüfen Sie die Adresse oder starten Sie auf der Startseite neu.') diff --git a/resources/views/errors/419.blade.php b/resources/views/errors/419.blade.php new file mode 100644 index 00000000..3742067e --- /dev/null +++ b/resources/views/errors/419.blade.php @@ -0,0 +1,5 @@ +@extends('errors.layout') + +@section('code', '419') +@section('title', 'Sitzung abgelaufen') +@section('message', 'Ihre Sitzung ist abgelaufen. Laden Sie die Seite neu und versuchen Sie es noch einmal.') diff --git a/resources/views/errors/500.blade.php b/resources/views/errors/500.blade.php new file mode 100644 index 00000000..7bda0107 --- /dev/null +++ b/resources/views/errors/500.blade.php @@ -0,0 +1,5 @@ +@extends('errors.layout') + +@section('code', '500') +@section('title', 'Interner Fehler') +@section('message', 'Da ist etwas schiefgelaufen. Wir sind informiert – bitte versuchen Sie es in wenigen Minuten erneut.') diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php new file mode 100644 index 00000000..f724e2a5 --- /dev/null +++ b/resources/views/errors/503.blade.php @@ -0,0 +1,5 @@ +@extends('errors.layout') + +@section('code', '503') +@section('title', 'Wartungsmodus') +@section('message', 'Wir führen gerade eine kurze Wartung durch und sind gleich wieder für Sie da.') diff --git a/resources/views/errors/layout.blade.php b/resources/views/errors/layout.blade.php new file mode 100644 index 00000000..c21d8720 --- /dev/null +++ b/resources/views/errors/layout.blade.php @@ -0,0 +1,93 @@ +{{-- + Gemeinsames Grundgerüst der Fehlerseiten. Bewusst self-contained + (Inline-CSS, keine Vite-Assets), damit die Seiten auch bei kaputtem + Asset-Build oder vor dem ersten `npm run build` zuverlässig rendern. +--}} + + + + + + + @yield('code') · @yield('title') – {{ $domainName ?? 'Pressekonto' }} + + + +
+
@yield('code')
+

@yield('title')

+

@yield('message')

+ Zur Startseite +
{{ $domainName ?? 'Pressekonto' }}
+
+ + diff --git a/tests/Feature/ErrorPagesTest.php b/tests/Feature/ErrorPagesTest.php new file mode 100644 index 00000000..32d5e3d7 --- /dev/null +++ b/tests/Feature/ErrorPagesTest.php @@ -0,0 +1,26 @@ +get('https://businessportal24.test/de/gibt-es-nicht') + ->assertNotFound() + ->assertSee('Seite nicht gefunden') + ->assertSee('Zur Startseite'); +}); + +test('custom error views render self-contained', function (string $view, string $expected) { + /** @var TestCase $this */ + $rendered = $this->view("errors.{$view}"); + + $rendered->assertSee($expected); + // Kein Vite-Asset: Die Seiten müssen auch bei kaputtem Build rendern. + expect((string) $rendered)->not->toContain('/build/'); +})->with([ + ['403', 'Zugriff verweigert'], + ['404', 'Seite nicht gefunden'], + ['419', 'Sitzung abgelaufen'], + ['500', 'Interner Fehler'], + ['503', 'Wartungsmodus'], +]);