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

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!)

  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

$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