6 KiB
6 KiB
Bootstrap-Problem gelöst: EarlyDomainParser
🚨 Problem identifiziert und gelöst
Problem: RouteServiceProvider wird vor der Middleware ausgeführt, dadurch ist domainInfo nicht verfügbar.
Lösung: EarlyDomainParser Service, der sowohl in Bootstrap-Phase als auch zur Laufzeit funktioniert.
🔧 EarlyDomainParser Service
Kern-Features:
- ✅ Bootstrap-sicher: Funktioniert ohne Laravel Service Container
- ✅ Stateless: Keine Abhängigkeiten, pure static methods
- ✅ Config-fallback: Lädt config/domains.php direkt wenn nötig
- ✅ Environment-fallback: Baut Config aus .env Variablen wenn nötig
- ✅ Doppelt verwendbar: RouteServiceProvider + SubdomainResolver
Verwendung:
// Parse aktuelle Domain
$domainInfo = EarlyDomainParser::parseDomain();
// Schnelle Domain-Type-Abfrage
$type = EarlyDomainParser::getCurrentDomainType(); // 'main', 'user-shop', etc.
// Check für User-Shop
$isUserShop = EarlyDomainParser::isUserShop();
// Subdomain extrahieren
$subdomain = EarlyDomainParser::getSubdomain();
// Main-URL für Redirects
$mainUrl = EarlyDomainParser::getMainUrl();
📁 Neue Dateien-Struktur
dev/subdomain-optimization-claude-v2/
├── src/
│ ├── Services/
│ │ └── EarlyDomainParser.php # Bootstrap-sicherer Domain Parser
│ ├── Http/Middleware/
│ │ ├── SubdomainResolver_Updated.php # Aktualisierte Middleware
│ └── Providers/
│ └── RouteServiceProvider.php # Aktualisierter RouteServiceProvider
└── BOOTSTRAP_SOLUTION.md # Diese Dokumentation
🚀 Implementation
Schritt 1: Service kopieren
cp dev/subdomain-optimization-claude-v2/src/Services/EarlyDomainParser.php app/Services/
Schritt 2: Aktualisierte Middleware kopieren
cp dev/subdomain-optimization-claude-v2/src/Http/Middleware/SubdomainResolver_Updated.php app/Http/Middleware/SubdomainResolver.php
Schritt 3: RouteServiceProvider aktualisieren
cp dev/subdomain-optimization-claude-v2/src/Providers/RouteServiceProvider.php app/Providers/
Schritt 4: Middleware registrieren
File: app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// WICHTIG: Nach StartSession!
\App\Http\Middleware\SubdomainResolver::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
// ... rest of middleware
],
];
Schritt 5: Cache löschen
php artisan config:clear
php artisan route:clear
🔄 Ausführungs-Reihenfolge (Problem gelöst!)
- Laravel Bootstrap: Service Container wird geladen
- RouteServiceProvider: Verwendet
EarlyDomainParser::getCurrentDomainType()- ✅ Funktioniert! Keine Session/Middleware-Abhängigkeit
- Routes werden geladen: Domain-spezifisch basierend auf Domain-Typ
- Request startet: Middleware-Pipeline beginnt
- StartSession: Laravel Session wird initialisiert
- SubdomainResolver: Verwendet
EarlyDomainParser::parseDomain()- ✅ Funktioniert! Session ist verfügbar für Shop-Setup
🧪 Domain-Type-Mapping im RouteServiceProvider
$routesToLoad = match ($domainType) {
'main' => ['main'], // mivita.care
'main-shop' => ['shop', 'portal'], // mivita.shop
'user-shop' => ['user-shop', 'portal'], // {user}.mivita.care
'crm' => ['crm'], // my.mivita.care
'portal' => ['portal'], // in.mivita.care
'checkout' => ['checkout'], // checkout.mivita.care
'unknown' => ['main'], // Fallback
default => ['main'],
};
✅ Vorteile der Lösung
1. Bootstrap-Phase Kompatibilität
- ✅ Funktioniert vor Service Container: Direkte config-File-Reads
- ✅ Funktioniert vor Session: Keine Session-Abhängigkeit
- ✅ Environment-Variables-Fallback: Funktioniert auch ohne Laravel
2. Runtime Kompatibilität
- ✅ Laravel-Config-Integration: Verwendet config() wenn verfügbar
- ✅ Session-Zugriff: Middleware kann Sessions verwenden
- ✅ Shared Logic: Beide Komponenten verwenden gleiche Domain-Parsing-Logik
3. Wartbarkeit
- ✅ Single Source of Truth: Eine Domain-Parsing-Logik
- ✅ Testbar: Stateless methods, einfache Unit Tests
- ✅ Performance: Minimaler Overhead durch static methods
🧪 Testing der Bootstrap-Lösung
Test 1: RouteServiceProvider Domain-Detection
# Check ob Route-Loading funktioniert
php artisan route:list | grep domain
# Debug: Check welche Domain-Type erkannt wurde
php artisan tinker
>>> App\Services\EarlyDomainParser::getCurrentDomainType()
Test 2: Middleware Domain-Parsing
# Test mit verschiedenen Hosts
curl -H "Host: mivita.care" http://localhost/
curl -H "Host: testuser.mivita.care" http://localhost/
curl -H "Host: my.mivita.care" http://localhost/
📋 Checkliste für erfolgreiche Implementation
- EarlyDomainParser Service kopiert und funktioniert
- RouteServiceProvider verwendet EarlyDomainParser erfolgreich
- SubdomainResolver Middleware verwendet EarlyDomainParser
- Route-Loading funktioniert domain-spezifisch
- Session-Handling funktioniert in Middleware
- Cache-Clear ohne Errors
- Domain-Detection funktioniert für alle Domain-Typen
- Redirect-Logic funktioniert für Unknown Domains
🎯 Das Bootstrap-Problem ist gelöst!
Mit dem EarlyDomainParser haben Sie eine robuste Lösung, die:
- Vor der Middleware (RouteServiceProvider) funktioniert
- Nach der Middleware (SubdomainResolver) funktioniert
- Dieselbe Domain-Parsing-Logik in beiden Phasen verwendet
- Alle config/domains.php Features unterstützt