Web Development April 2026 1199 views

Circuits en Égypte

Circuits en Égypte — Plateforme d'expériences mondiales Offrez des expériences de voyage et de circuits à haut taux de conversion et axées sur le SEO, grâce à une ingénierie de classe entreprise pour la vitesse, la fiabilité et la localisation.

Circuits en Égypte

Circuits en Égypte — Plateforme d'expériences mondiales

Offrez des expériences de voyage et de circuits à haut taux de conversion et axées sur le SEO, grâce à une ingénierie de classe entreprise pour la vitesse, la fiabilité et la localisation.

Ce dépôt est une application Laravel orientée production qui alimente une plateforme touristique multilingue et multi-devises. Elle résout le problème concret de l'exploitation de vastes inventaires de produits de voyage hétérogènes (excursions d'une journée, forfaits, croisières) en proposant :

  • Un catalogue de produits rapide et filtrable, optimisé pour les requêtes à faible latence et les recherches à facettes.
  • Un moteur de tarification et de réservation flexible qui prend en charge la tarification par plage de dates, les variantes de cabines/chambres et les politiques de prix pour enfants.
  • Une localisation complète (traduction de la langue + des slugs) et une conversion de devises pour un public mondial.

Proposition de valeur principale et points forts marketing

  • Performance et évolutivité : La plateforme est construite sur Laravel 12 et optimisée pour la mise à l'échelle grâce à une dénormalisation stratégique (la table product_filters), une mise en cache compatible avec Redis dans des services comme CurrencyService, et un regroupement frontend propulsé par Vite. L'agrégation lourde est précalculée au moment de l'écriture, ce qui permet des chemins de lecture extrêmement rapides pour le filtrage et l'affichage.

  • Excellence UX / UI : Tailwind CSS v4 + Vite offrent une interface utilisateur responsive et axée sur les composants. Une amélioration progressive et des points de terminaison JSON (par exemple, /api/tours-list) sont inclus pour prendre en charge des expériences côté client rapides et des widgets de saisie semi-automatique.

  • Sécurité et fiabilité : Les valeurs par défaut suivent les meilleures pratiques de Laravel : configuration stricte basée sur l'environnement, formulaires protégés contre les CSRF, validation rigoureuse via des Form Requests et une administration Filament pour un CRUD sécurisé. Le projet inclut des tests Pest et un formatage du code via Pint pour l'hygiène des développeurs.

Architecture technique et stack

  • Backend / API

    • Framework : Laravel 12 (PHP ^8.2).
    • Modèle : MVC + couche de service. Les services clés incluent FilterService, PricingService et CurrencyService (voir app/Services).
    • Administration : Filament v5 pour la gestion de contenu et une UX admin sécurisée.
    • Base de données : Relationnelle (Postgres recommandé). Le schéma inclut des product_filters dénormalisés pour accélérer les requêtes à facettes.
  • Frontend

    • Outils : Vite, Tailwind CSS v4.
    • Composants : Composants Blade réutilisables et points de terminaison orientés JSON pour une interface utilisateur asynchrone (recherche/saisie semi-automatique).
    • Tiers : Swiper pour les carrousels.
  • DevOps et infrastructure

    • Les scripts de développement locaux sont fournis dans composer.json (setup, dev, test).
    • CI : Le projet utilise Pest pour les tests et Pint pour le formatage ; à intégrer dans les pipelines CI pour appliquer les portes de qualité.
    • Cache : Utilise Laravel Cache (Redis recommandé) pour les listes de devises et les filtres calculés.
    • Conteneurisation : Fonctionne dans Docker via Laravel Sail ou votre environnement d'exécution PHP préféré.

Diagramme d'architecture

graph LR
	A[Navigateur utilisateur] -->|HTTP/HTTPS| B[Frontend Laravel (Blade + Vite)]
	B --> C[Routes/Contrôleurs]
	C --> D[Couche de service]
	D -->|écriture| E[table product_filters]
	D -->|lecture/écriture| F[Produits / Tarification / Départs]
	F --> G[Postgres]
	D --> H[Cache CurrencyService (Redis)]
	I[Administration Filament] --> F

Fonctionnalités clés et analyses techniques approfondies

  1. Filtres de produits (recherche à facettes rapide)
  • Fonctionnalité : Filtres de produits précalculés stockés dans product_filters pour permettre un filtrage à facettes efficace selon les pays, les destinations, les taxinomies, les fourchettes de prix et la durée.
  • Le défi : Exécuter des jointures ad hoc ou des agrégations lourdes sur de grands catalogues de produits et leurs traductions entraîne des chargements de page lents et des requêtes complexes.
  • Solution d'ingénierie : FilterService::rebuildProductFilters() (voir app/Services/FilterService.php) compose des lignes normalisées lors de la sauvegarde/mise à jour du produit et les insère dans product_filters. Le chemin de lecture utilise une logique d'intersection (getProductIdsByFilters) pour combiner les critères de filtre efficacement : cela transforme les recherches plusieurs-à-plusieurs en requêtes indexées simples et réduit la pression sur la base de données au moment de l'exécution.
  1. Tarification et réservation (plages de dates, cabines, politiques enfants)
  • Fonctionnalité : Calcul précis des devis à travers des variantes de prix (par personne, par cabine), les départs et les remplacements par plage de dates.
  • Le défi : Les règles de tarification varient selon la date de voyage, le type de cabine ou de chambre et les politiques de réduction pour enfants ; le système doit renvoyer des devis cohérents et auditables.
  • Solution d'ingénierie : PricingService::calculateQuote() (voir app/Services/PricingService.php) résout l'unité de base correcte en vérifiant les prix spécifiques aux départs, les prix des cabines, les lignes de tarification datées et enfin des solutions de repli sûres. La tarification pour enfants utilise childPolicyRules pour calculer les réductions par âge ; la conversion de devises est déléguée à CurrencyService pour une source unique de vérité. L'implémentation utilise un ordre sensé (plage->fallback->created_at) pour sélectionner de manière déterministe la bonne ligne de prix.
  1. Routage multilingue et SEO
  • Fonctionnalité : Routes localisées avec slugs traduits, URL canoniques et filtres tenant compte de la langue.
  • Le défi : Servir du contenu localisé convivial pour le SEO tout en évitant les conflits de routage avec les slugs réservés et en préservant la compatibilité ascendante.
  • Solution d'ingénierie : Les routes sont regroupées et protégées par le middleware SetLocale et des groupes de préfixes localisés dans routes/web.php. Les routes de produits imbriquées et centrées sur le pays utilisent des exclusions par regex pour éviter les collisions de slugs réservés. Les traductions sont stockées dans des tables de traduction par entité et les lignes de filtre prenant en compte la traduction incluent language_id, de sorte que les filtres de l'interface utilisateur n'affichent que les slugs pertinents pour la locale sélectionnée.