Egypten-Reise
Egypt Tours — Global Experiences Platform Leistungsstarke, SEO-optimierte Reiseerlebnisse mit Enterprise-Engineering für Geschwindigkeit, Zuverlässigkeit und Lokalisierung.
Egypt Tours — Globale Erlebnisse-Plattform
Leistungsstarke, SEO-optimierte Reiseerlebnisse mit Enterprise-Engineering für Geschwindigkeit, Zuverlässigkeit und Lokalisierung.
Dieses Repository ist eine produktionsorientierte Laravel-Anwendung, die eine mehrsprachige Plattform für Tourismus mit mehreren Währungen antreibt. Sie löst das reale Problem der Verwaltung grosser Bestände heterogener Reiseprodukte (Tagestouren, Pakete, Kreuzfahrten) durch:
- Einen schnellen, filterbaren Produktkatalog, der für Abfragen mit geringer Latenz und facettierte Suchen optimiert ist.
- Eine flexible Preis- und Buchungsmaschine, die preisbasierte Zeiträume, Kabinen-/Zimmervarianten und Richtlinien für Kinderpreise unterstützt.
Kern-Wertversprechen & Marketing-Highlights
-
Performance & Skalierbarkeit: Die Plattform basiert auf Laravel 12 und ist für Skalierbarkeit optimiert – mit strategischer Denormalisierung (der
product_filters-Tabelle), Redis-freundlichem Caching in Diensten wieCurrencyServiceund Vite-gestütztem Frontend-Bundling. Schwere Aggregationen werden zum Zeitpunkt des Schreibens vorausberechnet, was extrem schnelle Lesepfade für Filterung und Auflistung ermöglicht. -
UX / UI-Exzellenz: Tailwind CSS v4 + Vite liefern eine reaktionsschnelle, komponentenbasierte UI. Progressive Enhancement und JSON-Endpunkte (z.B.
/api/tours-list) sind enthalten, um schnelle clientseitige Erlebnisse und Autocomplete-Widgets zu unterstützen. -
Sicherheit & Zuverlässigkeit: Die Standards folgen den Laravel-Best-Practices—strenge umgebungsgesteuerte Konfiguration, CSRF-geschützte Formulare, gründliche Validierung durch Form Requests und ein Filament-Admin-Bereich für sicheres CRUD. Das Projekt enthält Pest-Tests und Code-Formatierung via Pint für die Entwicklerhygiene.
Technische Architektur & Stack
-
Backend / API
- Framework: Laravel 12 (PHP ^8.2).
- Muster: MVC + Service-Layer. Zu den wichtigsten Diensten gehören
FilterService,PricingServiceundCurrencyService(siehe app/Services). - Admin: Filament v5 für Inhaltsverwaltung und sichere Admin-UX.
- Datenbank: Relational (Postgres empfohlen). Das Schema beinhaltet denormalisierte
product_filterszur Beschleunigung facettierter Abfragen.
-
Frontend
- Tools: Vite, Tailwind CSS v4.
- Komponenten: Wiederverwendbare Blade-Komponenten und JSON-Endpunkte für asynchrone UI (Suche/Autocomplete).
- Drittanbieter: Swiper für Karussells.
-
DevOps & Infrastruktur
- Lokale Entwicklerskripte werden in composer.json bereitgestellt (
setup,dev,test). - CI: Das Projekt verwendet Pest für Tests und Pint für Formatierung; Integration in CI-Pipelines zur Durchsetzung von Qualitätsgates.
- Cache: Verwendet Laravel Cache (Redis empfohlen) für Währungslisten und berechnete Filter.
- Containerisierung: Funktioniert in Docker via Laravel Sail oder Ihrer bevorzugten PHP-Runtime.
- Lokale Entwicklerskripte werden in composer.json bereitgestellt (
Architektur-Diagramm
graph LR
A[Benutzer-Browser] -->|HTTP/HTTPS| B[Laravel-Frontend (Blade + Vite)]
B --> C[Routen/Controller]
C --> D[Service-Layer]
D -->|schreibt| E[product_filters-Tabelle]
D -->|liest/schreibt| F[Produkte / Preise / Abfahrten]
F --> G[Postgres]
D --> H[CurrencyService Cache (Redis)]
I[Filament-Admin] --> F
Hauptfunktionen & technische Vertiefungen
- Produktfilter (schnelle facettierte Suche)
- Funktion: Vorausberechnete Produktfilter, die in
product_filtersgespeichert sind, um eine effiziente facettierte Filterung über Länder, Ziele, Taxonomien, Preisbereiche und Dauer hinweg zu ermöglichen. - Die Herausforderung: Ad-hoc-Joins oder schwere Aggregationen über grosse Produktkataloge und Übersetzungen hinweg führen zu langsamen Seitenaufrufen und komplexen Abfragen.
- Technische Lösung:
FilterService::rebuildProductFilters()(siehe app/Services/FilterService.php) setzt normalisierte Zeilen beim Speichern/Aktualisieren eines Produkts zusammen und fügt sie inproduct_filtersein. Der Lesepfad verwendet Schnittmengen-Logik (getProductIdsByFilters), um Filterkriterien effizient zu kombinieren—dies verwandelt Many-to-Many-Lookups in einfache indexierte Abfragen und reduziert den Datenbankdruck zur Laufzeit.
- Preisgestaltung & Buchung (Zeiträume, Kabinen, Kinderrichtlinien)
- Funktion: Genaue Angebotskalkulation über Preisvarianten (pro Person, pro Kabine), Abfahrten und Überschreibungen von Datumsbereichen.
- Die Herausforderung: Preisregeln variieren je nach Reisedatum, Kabinen- oder Zimmertyp und Kinderermässigungsrichtlinien; das System muss konsistente, prüfbare Angebote zurückgeben.
- Technische Lösung:
PricingService::calculateQuote()(siehe app/Services/PricingService.php) bestimmt die korrekte Basiseinheit durch Prüfung abfahrtsspezifischer Preise, Kabinenpreise, datierter Preiszeilen und schliesslich sicherer Fallbacks. Kinderpreise verwendenchildPolicyRuleszur Berechnung von Rabatten pro Alter; die Währungsumrechnung wird anCurrencyServicedelegiert, um eine einzige Quelle der Wahrheit zu haben. Die Implementierung verwendet eine sinnvolle Reihenfolge (Bereich->Fallback->Erstellt-am), um die korrekte Preiszeile deterministisch auszuwählen.
- Mehrsprachiges Routing & SEO
- Funktion: Lokalisierte Routen mit übersetzten Slugs, kanonischen URLs und sprachbewussten Filtern.
- Die Herausforderung: Bereitstellung von SEO-freundlichen, lokalisierten Inhalten unter Vermeidung von Routing-Konflikten mit reservierten Slugs und Wahrung der Abwärtskompatibilität.
- Technische Lösung: Routen werden gruppiert und mit
SetLocale-Middleware und lokalisierten Präfixgruppen in routes/web.php geschützt. Länder-fokussierte und verschachtelte Produktrouten verwenden Regex-Ausschlüsse, um Kollisionen mit reservierten Slugs zu vermeiden. Übersetzungen werden in tabellenspezifischen Übersetzungstabellen gespeichert und übersetzungsbewusste Filterzeilen enthaltenlanguage_id, damit UI-Filter nur relevante Slugs für die ausgewählte Sprache anzeigen.