mivita/dev/subdomain-optimization-claude-v2/BOOTSTRAP_SOLUTION.md
2025-10-20 17:42:08 +02:00

170 lines
No EOL
6 KiB
Markdown

# 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:
```php
// 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
```bash
cp dev/subdomain-optimization-claude-v2/src/Services/EarlyDomainParser.php app/Services/
```
### Schritt 2: Aktualisierte Middleware kopieren
```bash
cp dev/subdomain-optimization-claude-v2/src/Http/Middleware/SubdomainResolver_Updated.php app/Http/Middleware/SubdomainResolver.php
```
### Schritt 3: RouteServiceProvider aktualisieren
```bash
cp dev/subdomain-optimization-claude-v2/src/Providers/RouteServiceProvider.php app/Providers/
```
### Schritt 4: Middleware registrieren
**File: `app/Http/Kernel.php`**
```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
```bash
php artisan config:clear
php artisan route:clear
```
## 🔄 Ausführungs-Reihenfolge (Problem gelöst!)
1. **Laravel Bootstrap**: Service Container wird geladen
2. **RouteServiceProvider**: Verwendet `EarlyDomainParser::getCurrentDomainType()`
- ✅ Funktioniert! Keine Session/Middleware-Abhängigkeit
3. **Routes werden geladen**: Domain-spezifisch basierend auf Domain-Typ
4. **Request startet**: Middleware-Pipeline beginnt
5. **StartSession**: Laravel Session wird initialisiert
6. **SubdomainResolver**: Verwendet `EarlyDomainParser::parseDomain()`
- ✅ Funktioniert! Session ist verfügbar für Shop-Setup
## 🧪 Domain-Type-Mapping im RouteServiceProvider
```php
$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
```bash
# 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
```bash
# 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