170 lines
No EOL
6 KiB
Markdown
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 |