update 20.10.2025
This commit is contained in:
parent
8ccd81b770
commit
a67740d6ef
612 changed files with 84540 additions and 4008 deletions
241
dev/subdomain-optimization-claude/README.md
Normal file
241
dev/subdomain-optimization-claude/README.md
Normal file
|
|
@ -0,0 +1,241 @@
|
|||
# Domain-Routing Optimierung - Sauberes Session-Handling
|
||||
|
||||
## 📋 Problemanalyse
|
||||
|
||||
### Das Kernproblem
|
||||
|
||||
Das aktuelle Domain-Routing-System von Mivita hat ein **Session-Timing-Problem**:
|
||||
|
||||
1. **DomainResolver-Middleware** läuft **VOR** der Laravel `StartSession`-Middleware
|
||||
2. Sie versucht Session-Daten zu setzen (`Session::put`, `Session::save`)
|
||||
3. Dadurch wird eine "provisorische" Session erstellt
|
||||
4. **StartSession-Middleware** läuft danach und erstellt eine neue Session
|
||||
5. **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
|
||||
|
||||
1. **DomainContextResolver** (vor Session):
|
||||
|
||||
- Analysiert nur Domain/Subdomain
|
||||
- Speichert Kontext im Request-Objekt
|
||||
- Konfiguriert Session-Domain für Cookies
|
||||
- **Kein Session-Zugriff!**
|
||||
|
||||
2. **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 `UserShopObserver` sofort 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 `DomainSessionManager` in 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
|
||||
|
||||
```php
|
||||
// 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
|
||||
|
||||
```php
|
||||
// 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
|
||||
|
||||
```php
|
||||
// 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
|
||||
|
||||
1. **Domain-Parsing**: Caching der Domain-Analyse
|
||||
2. **UserShop-Lookups**: Intelligentes Caching mit Tags und **sofortiger Invalidierung bei Änderungen** durch einen Model-Observer.
|
||||
3. **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 Types
|
||||
- `src/Services/` - Optimierte Services
|
||||
- `src/Services/SessionStrategies/` - Gekapselte Session-Logik pro Domain-Typ
|
||||
- `src/Middleware/` - Neue Middleware
|
||||
- `src/Observers/` - Echtzeit-Cache-Invalidierung
|
||||
- `src/Contracts/` - Interfaces
|
||||
- `config/` - Konfiguration
|
||||
- `tests/` - 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**
|
||||
Loading…
Add table
Add a link
Reference in a new issue