- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
7.1 KiB
ErrorRenderer Refactoring - Unified Interface & Template Integration
Problem-Analyse
Aktuelle Probleme
-
Interface-Hierarchie ist nicht optimal:
ErrorRenderer(base) →HttpErrorRendererextends →CliErrorRendererextends- Verschiedene Interfaces mit unterschiedlichen Methoden
- Factory muss spezifische Interfaces prüfen (
HttpErrorRenderer,CliErrorRenderer)
-
HTTP Renderer verwendet kein Template System:
- Hardcoded HTML-Strings in
ResponseErrorRenderer - Sollte
EngineundRenderContextaus Template-System verwenden - Template-basierte Error-Pages wären besser wartbar
- Hardcoded HTML-Strings in
-
HttpEmitter Kontext:
- Klarstellung: HTML-Rendering sollte nur im Middleware-Kontext passieren
- Renderer erstellt nur
HttpResponse, Emitter bleibt in Application/Middleware - Außerhalb Middleware (z.B. Bootstrap): Fallback auf einfaches HTML
Lösungsvorschlag
1. Unified ErrorRenderer Interface (OHNE Hierarchie)
Neue Struktur:
interface ErrorRenderer
{
/**
* Check if this renderer can handle the exception
*/
public function canRender(\Throwable $exception): bool;
/**
* Render exception to appropriate output format
*
* @return mixed HttpResponse for HTTP context, void for CLI context
*/
public function render(
\Throwable $exception,
?ExceptionContextProvider $contextProvider = null
): mixed;
}
Alle Renderer implementieren das gleiche Interface:
ResponseErrorRenderer→HttpResponsezurückgebenConsoleErrorRenderer→void(gibt direkt auf Console aus)
2. HTTP Renderer mit Template System
ResponseErrorRenderer sollte:
- Template System (
Engine,RenderContext) für HTML-Rendering verwenden - Error-Templates mit
.view.phpEndung (auto-discovered) - JSON-Responses direkt erstellen (bleibt gleich)
- Template-Namen:
errors/error,errors/404,errors/500
Template-Struktur (mit .view.php Endung):
resources/views/errors/
├── error.view.php # Basis Error-Template
├── 404.view.php # 404-spezifisches Template
├── 500.view.php # 500-spezifisches Template
└── debug.view.php # Debug-Informationen (nur wenn debug=true)
Wichtig: Templates werden auto-discovered über Discovery-System
3. HttpEmitter & Rendering-Kontext
Architektur:
Exception im Middleware-Stack
→ ExceptionHandlingMiddleware fängt Exception
→ ErrorKernel->createHttpResponse()
→ ResponseErrorRenderer.render() (Template-System für HTML)
→ HttpResponse zurückgegeben
→ ResponseEmitter emittet Response (in Application)
Exception außerhalb Middleware (z.B. Bootstrap)
→ GlobalExceptionHandler->handle()
→ ErrorKernel->handle() (nur Logging, kein Response)
→ Oder: Fallback HTML direkt (ohne Template-System)
Prinzip:
- Renderer erstellt nur
HttpResponse- kein direkter HttpEmitter-Aufruf - HTML-Rendering mit Templates nur im Middleware-Kontext
- Außerhalb Middleware: Fallback auf einfache HTML-Strings
4. Entfernung der Interface-Hierarchie
Zu entfernen:
HttpErrorRendererInterfaceCliErrorRendererInterface
Zu behalten/ändern:
ErrorRendererInterface (einheitlich)ResponseErrorRenderer→ implementiertErrorRendererConsoleErrorRenderer→ implementiertErrorRenderer
5. Factory-Anpassung
ErrorRendererFactory:
- Nutzt nur noch
ErrorRendererInterface - Keine spezifischen Interface-Prüfungen mehr nötig
- Einfacher und konsistenter
Implementierungs-Plan
Phase 1: Interface-Vereinheitlichung
-
ErrorRenderer Interface refactoren
render()Methode mitmixedReturn-TypecanRender()bleibt gleich
-
ResponseErrorRenderer anpassen
- Implementiert nur noch
ErrorRenderer render()gibtHttpResponsezurückcreateResponse()entfernen (wird zurender())
- Implementiert nur noch
-
ConsoleErrorRenderer anpassen
- Implementiert nur noch
ErrorRenderer render()gibtvoidzurückrenderToConsole()entfernen (wird zurender())
- Implementiert nur noch
-
HttpErrorRenderer & CliErrorRenderer Interfaces löschen
Phase 2: Template System Integration
-
Error Templates erstellen (mit
.view.phpEndung)resources/views/errors/error.view.php- Basis Error-Templateresources/views/errors/404.view.php- 404 Templateresources/views/errors/500.view.php- 500 Templateresources/views/errors/debug.view.php- Debug Template (optional)
-
ResponseErrorRenderer mit Template System
Engineüber DI injizierenRenderContextfür Template-Rendering erstellen- HTML-Rendering über Templates (auto-discovered)
- JSON-Responses bleiben direkt (kein Template nötig)
- Fallback auf einfaches HTML wenn Template nicht gefunden
-
Template-Discovery Integration
- Templates werden automatisch über Discovery-System gefunden
- Template-Namen:
errors/error,errors/404, etc. - Template-Loader findet Templates automatisch
Phase 3: Factory & Integration
-
ErrorRendererFactory vereinfachen
- Nur noch
ErrorRendererInterface verwenden - Spezifische Methoden (
getHttpRenderer(),getCliRenderer()) entfernen
- Nur noch
-
ErrorKernel anpassen
- Nutzt einheitliches
ErrorRendererInterface createHttpResponse()verwendetrender()Methode
- Nutzt einheitliches
-
Tests aktualisieren
- Alle Renderer-Tests anpassen
- Template-System-Tests hinzufügen
Dateien zu ändern
Zu ändern:
src/Framework/ExceptionHandling/ErrorRenderer.php- Interface vereinheitlichensrc/Framework/ExceptionHandling/Renderers/ResponseErrorRenderer.php- Template System integrierensrc/Framework/ExceptionHandling/Renderers/ConsoleErrorRenderer.php- Interface anpassensrc/Framework/ExceptionHandling/ErrorRendererFactory.php- Vereinfachensrc/Framework/ExceptionHandling/ErrorKernel.php- Renderer-Aufruf anpassen
Zu löschen:
src/Framework/ExceptionHandling/HttpErrorRenderer.php- Interface entfernensrc/Framework/ExceptionHandling/CliErrorRenderer.php- Interface entfernen
Neu zu erstellen:
resources/views/errors/error.view.php- Basis Error-Template (auto-discovered)resources/views/errors/404.view.php- 404 Templateresources/views/errors/500.view.php- 500 Templateresources/views/errors/debug.view.php- Debug Template (optional)
Vorteile
✅ Einheitliches Interface: Alle Renderer verwenden das gleiche Interface ✅ Keine Interface-Hierarchie: Einfacher und klarer ✅ Template-basierte Error-Pages: Wartbarer und konsistenter ✅ Framework-Integration: Nutzt vorhandenes Template-System ✅ Bessere Testbarkeit: Einheitliche Interface-Struktur ✅ Auto-Discovery: Templates werden automatisch gefunden
Zusammenfassung
- ✅ Templates haben
.view.phpEndung und werden auto-discovered - ✅ HTML-Rendering nur im Middleware-Kontext (mit Templates)
- ✅ Außerhalb Middleware: Fallback auf einfaches HTML
- ✅ Renderer erstellt nur Response, Emitter bleibt in Application
- ✅ Einheitliches
ErrorRendererInterface ohne Hierarchie