| .. | ||
| config | ||
| docs | ||
| src | ||
| tests | ||
| MIGRATION_GUIDE.md | ||
| README.md | ||
| SUMMARY.md | ||
Domain-Routing Optimierung - Sauberes Session-Handling
📋 Problemanalyse
Das Kernproblem
Das aktuelle Domain-Routing-System von Mivita hat ein Session-Timing-Problem:
- DomainResolver-Middleware läuft VOR der Laravel
StartSession-Middleware - Sie versucht Session-Daten zu setzen (
Session::put,Session::save) - Dadurch wird eine "provisorische" Session erstellt
- StartSession-Middleware läuft danach und erstellt eine neue Session
- Resultat: Session-Daten gehen verloren, UserShop-Wechsel funktionieren nicht
Aktuelle Architektur
Request → DomainResolver → StartSession → AuthenticateSession → Controller
↑ Setzt Session-Daten ↑ Erstellt neue Session
❌ Session-Daten verloren
Multi-Domain-Setup
- Hauptdomain:
mivita.test/mivita.care - Feste Subdomains:
in.mivita.care- Kundenbackend (Portal)my.mivita.care- Beraterbackend (CRM)checkout.mivita.care- Zahlungsseite
- Dynamische Subdomains: 500+ UserShop-Domains (
{berater}.mivita.care)
Session-Anforderungen
- UserShop-Persistenz: UserShop muss beim Domain-Wechsel erhalten bleiben
- Warenkorb-Kontinuität: Checkout-Domain benötigt vollständigen Session-Zugriff
- Zurück-zum-Shop: Portal/CRM brauchen UserShop-Referenz
🎯 Optimierte Lösung
Neue Architektur
Request → DomainContextResolver → StartSession → DomainSessionManager → Controller
↑ Nur Domain-Analyse ↑ Session Start ↑ Session-Management
✅ Kein Session-Zugriff ✅ Sichere Session-Ops
Prinzip der Trennung
-
DomainContextResolver (vor Session):
- Analysiert nur Domain/Subdomain
- Speichert Kontext im Request-Objekt
- Konfiguriert Session-Domain für Cookies
- Kein Session-Zugriff!
-
DomainSessionManager (nach Session):
- Übernimmt Session-Management
- Setzt/erhält UserShop-Daten
- Verwaltet Domain-spezifische Session-Logik
Vorteile
- ✅ Keine doppelten Sessions
- ✅ Saubere Trennung der Verantwortlichkeiten
- ✅ Besseres Caching (Domain-Parsing vs Session-Management)
- ✅ Einfacheres Testing
- ✅ Performance-Verbesserung
- ✅ Bessere Wartbarkeit
Wichtige Verbesserungen (gegenüber dem ursprünglichen Claude-Ansatz)
- ⚡️ Event-Gesteuerte Echtzeit-Cache-Invalidierung: Anstatt auf den Ablauf des Caches (TTL) zu warten, wird der UserShop-Cache nun durch einen
UserShopObserversofort geleert, wenn sich relevante Daten in der Datenbank ändern (z.B. ein Shop wird deaktiviert). Das erhöht die Datenkonsistenz massiv. - 🧩 Strategy Pattern für Session-Management: Die Logik zur Behandlung der Session für verschiedene Domain-Typen wurde aus dem
DomainSessionManagerin dedizierte, austauschbare Strategie-Klassen ausgelagert. Das macht das System extrem sauber, erweiterbar (neue Domain-Typen erfordern keine Änderung am Kern) und entspricht dem Open/Closed-Prinzip.
🏗️ Implementation
1. Domain Context System
// Erweiterte DomainContext-Klasse
class DomainContext
{
public readonly DomainType $type;
public readonly string $host;
public readonly ?string $subdomain;
public readonly ?UserShop $userShop;
// Neue Methoden für Session-Handling
public function shouldPreserveUserShop(): bool;
public function getSessionDomain(): string;
public function toArray(): array;
}
// Type-Safe Enum für Domain-Typen
enum DomainType: string
{
case MAIN = 'main';
case SHOP = 'shop';
case USER_SHOP = 'user-shop';
case CRM = 'crm';
case PORTAL = 'portal';
case CHECKOUT = 'checkout';
case UNKNOWN = 'unknown';
}
2. Services Layer & Session-Strategien
// Optimierter DomainService mit verbessertem Caching
class DomainService
{
// Trennung von Domain-Parsing und UserShop-Loading
public function parseDomain(string $host): DomainParseResult;
public function loadUserShop(string $slug): ?UserShop;
// Verbessertes Caching mit Echtzeit-Invalidierung
public function clearUserShopCache(string $slug): void;
public function warmUpCache(array $slugs): void;
}
// Refaktorisierter Session-Manager Service (nutzt Strategy Pattern)
class DomainSessionManager
{
// Delegiert die Logik an die passende Strategie
public function handleDomainSpecificSession(DomainContext $context, Request $request): void;
}
// NEU: Saubere, gekapselte Logik pro Domain-Typ
interface DomainSessionStrategyInterface {
public function handle(DomainContext $context): void;
}
class UserShopSessionStrategy implements DomainSessionStrategyInterface { /* ... */ }
class CrmSessionStrategy implements DomainSessionStrategyInterface { /* ... */ }
// ... etc.
3. Middleware Stack
// 1. DomainContextResolver (vor Session)
class DomainContextResolver
{
public function handle($request, $next) {
// Nur Domain-Analyse, kein Session-Zugriff
$context = $this->domainService->resolveDomain($request->getHost());
$request->attributes->set('domain_context', $context);
// Session-Domain für Cookies konfigurieren
Config::set('session.domain', $context->getSessionDomain());
return $next($request);
}
}
// 2. DomainSessionManager (nach Session)
class DomainSessionManager
{
public function handle($request, $next) {
$response = $next($request);
// Jetzt ist Session verfügbar
$context = $request->attributes->get('domain_context');
$this->sessionManager->handleDomainSpecificSession($context, $request);
return $response;
}
}
🚀 Migration Plan
Phase 1: Neue Struktur implementieren
- Neue DomainContext mit Session-Methoden
- DomainService refactoring
- Neue Middleware implementieren
Phase 2: Testing
- Unit Tests für alle Komponenten
- Integration Tests für Session-Wechsel
- Performance-Tests
Phase 3: Rollout
- Neue Middleware parallel registrieren
- Schrittweise Migration
- Alte Middleware entfernen
Phase 4: Cleanup
- Legacy-Code entfernen
- Dokumentation aktualisieren
📊 Performance Verbesserungen
Caching Strategie
- Domain-Parsing: Caching der Domain-Analyse
- UserShop-Lookups: Intelligentes Caching mit Tags und sofortiger Invalidierung bei Änderungen durch einen Model-Observer.
- Session-State: Reduzierte Session-Zugriffe
Erwartete Verbesserungen
- 20-30% weniger DB-Queries durch besseres Caching
- 50% schnellere Domain-Resolution durch optimierten Parser
- Keine Session-Konflikte mehr
📝 Implementierung Details
Siehe /src Verzeichnis für die vollständige Implementation:
src/Domain/- Domain Context und Typessrc/Services/- Optimierte Servicessrc/Services/SessionStrategies/- Gekapselte Session-Logik pro Domain-Typsrc/Middleware/- Neue Middlewaresrc/Observers/- Echtzeit-Cache-Invalidierungsrc/Contracts/- Interfacesconfig/- Konfigurationtests/- Comprehensive Tests
🔧 Configuration
Die Lösung ist vollständig rückwärtskompatibel mit der bestehenden config/domains.php.
📋 Testing
Umfassende Test-Suite für alle Szenarien:
- Domain-Wechsel mit Session-Erhaltung
- UserShop-Persistenz
- Performance unter Last
- Edge Cases
Entwickelt für: Mivita.care
Status: Ready for Implementation
Geschätzte Implementierungszeit: 2-3 Tage