← Retour à l'accueil

Étude de cas · Amanéa Voyages

Un site sur mesure pour une agence qui voulait reprendre la main.

MVC PHP 8 codé from scratch, router maison, base MySQL relationnelle, UX éditoriale et SEO/GEO sur mesure. Un site bilingue avec backoffice, espace client et gestion des réservations — sans CMS, sans plugins, avec un code que l'équipe peut maintenir à long terme.

Stack
PHP 8 MVC custom · Router maison · MySQL · SCSS · SEO/GEO sur mesure
Durée
8 semaines
Résultat
Autonomie totale de l'équipe
FR/EN Bilingue natif
5 mod. Modules métier
0 plugin MVC pur, sans CMS
01

Le contexte

Amanéa est une agence de voyages qui propose des séjours sur mesure. Le site existant tournait sous WordPress avec une accumulation de plugins difficiles à maintenir. L'équipe ne pouvait pas modifier le catalogue sans passer par un prestataire externe. Il n'y avait pas d'espace client, pas de suivi de réservation, et chaque mise à jour de contenu prenait une journée et une facture. La demande était directe : reprendre la main.

02

Pourquoi du MVC sans CMS

La première discussion portait sur WordPress. Rapide à démarrer, communauté large. Mais obtenir une gestion de réservations propre, un backoffice de destinations, un espace client sécurisé et une interface bilingue sans empilement de plugins s'avérait impossible sans recréer exactement ce qu'on voulait éviter. Un MVC PHP natif, léger, sans dépendance lourde, laissait toute l'architecture dans les mains du projet — pas d'un écosystème tiers à surveiller, pas de mise à jour Symfony/Laravel à craindre, pas de breaking change imposé par un thème ou un plugin.

03

L'architecture MVC, codée from scratch

Trois couches strictes — Model, View, Controller — orchestrées par un router maison que j'ai écrit ligne par ligne. Le front controller `public/index.php` capte toutes les requêtes via .htaccess, les passe au routeur qui mappe URL → Controller::action, instancie le bon contrôleur et délègue la réponse. Autoload PSR-4 via Composer pour la résolution de classes, namespaces `App\Controllers`, `App\Models`, `Core\` pour le noyau. Base MySQL relationnelle avec tables normalisées (destinations, offres, clients, réservations, médias) et clés étrangères propres. Les Models encapsulent les requêtes PDO préparées, les Controllers contiennent la logique métier, les Views ne font que du rendu. Aucun framework. Chaque couche connue, chaque ligne maîtrisée.

Architecture MVC — Router custom, Models, MySQL, Views, SEO/GEO sur mesure

Entry Router Controllers Models Persistence .htaccess URL / HTTP browser Custom router Core\Router URL → action PSR-4 autoload Public Home · Destination Offer · Contact Client Auth · Account Booking · Carnet PDF Backoffice Admin CRUD · Médias Models · PDO Project · User Booking · Media prepared statements MySQL Relational DB destinations · offres clients · réservations médias · langues Response Views · SCSS · WebP i18n FR/EN · accessibilité AA SEO / GEO sur mesure JSON-LD · hreflang · sitemap · pages géo
04

Le backoffice

L'équipe Amanéa gère l'intégralité du contenu sans aucune aide technique. L'interface permet de créer, modifier et archiver des destinations, d'y rattacher des offres avec dates, prix et disponibilités, et d'uploader des visuels directement depuis le navigateur. La gestion des réservations entrantes — avec statuts en attente, confirmée, annulée — est centralisée dans le même espace. Aucune ligne de code à toucher pour une mise à jour courante.

05

L'espace client

Chaque client dispose d'un compte sécurisé. Après réservation, il accède à un tableau de bord : statut en temps réel de sa commande, récapitulatif du séjour, et téléchargement du carnet de voyage en PDF. L'authentification repose sur des sessions PHP avec hachage bcrypt, sans dépendance externe. La gestion de session est cloisonnée : les cookies sont httponly, les identifiants jamais stockés en clair.

06

L'UX éditoriale

Une agence de voyages haut de gamme se juge dès la première seconde. Le travail UX a été cadré comme un projet à part entière : hiérarchie typographique stricte (fonte serif éditoriale pour les titres, sans-serif lisible pour le corps), grilles cohérentes entre pages destinations / offres / espace client, micro-interactions sobres au survol, lecture confortable jusqu'à 1.75 d'interlignage. Le parcours de réservation a été pensé en 3 clics maximum entre la page destination et l'envoi de la demande. Accessibilité AA respectée, navigation clavier complète, contrastes vérifiés. Le résultat se mesure aussi : Lighthouse ≥ 90 sur performance, accessibilité et SEO.

07

Le bilingue FR/EN & le SEO/GEO sur mesure

Système i18n natif codé à la main : fichiers de langue indexés par clé, langue active en session, fallback déterministe. Chaque page est accessible dans les deux langues sans duplication de routes. Côté SEO, tout est généré côté serveur par le routeur : balises title et meta description dynamiques par contrôleur, Open Graph et Twitter Card, hreflang FR/EN/x-default injectés dans le layout, canonical par page, schémas JSON-LD (Organization, BreadcrumbList, ProfessionalService) émis selon la route. Sitemap XML servi par un contrôleur dédié, robots.txt versionné. Pages géo locales générées dynamiquement à partir d'un dictionnaire de villes — contenu unique par ville, schéma LocalBusiness propre, pour ranker sur les requêtes "agence de voyages + ville" sans contenu dupliqué.

08

La mise en production

Déploiement sur hébergement Apache mutualisé. Configuration htaccess pour le routing MVC, désactivation du listing de répertoires, cache navigateur longue durée sur les assets statiques, compression Gzip. Variables d'environnement pour les secrets (phpdotenv). Les erreurs PHP sont masquées en production et redirigées vers un log applicatif. Toutes les images servies en WebP avec lazy loading. La maintenance courante — mises à jour de contenu — est traitée sous 48h.

09

Ce que j'ai retenu

Sur Amanéa, la valeur n'était pas dans la complexité technique mais dans l'adéquation entre l'architecture et les usages réels. L'équipe modifie son catalogue seule. Les clients retrouvent leurs réservations sans friction. Le code est suffisamment lisible pour qu'une autre main puisse s'en emparer. Ces trois critères — autonomie de l'équipe, clarté pour le client final, maintenabilité — sont devenus la grille que j'applique à chaque projet.