No description
  • PHP 79.6%
  • Twig 13%
  • JavaScript 3.1%
  • CSS 2.9%
  • Dockerfile 0.8%
  • Other 0.6%
Find a file
2026-07-16 14:10:15 +00:00
.claude add clipboard copy 2026-07-16 16:09:42 +02:00
.idea done* 2026-07-16 14:47:05 +02:00
assets add clipboard copy 2026-07-16 16:09:42 +02:00
bin Initial commit 2025-12-06 11:23:06 +01:00
config done* 2026-07-16 14:47:05 +02:00
docker/db update 2026-06-14 21:58:18 +02:00
frankenphp update 2026-06-14 21:58:18 +02:00
migrations make migration script 2026-01-01 18:41:22 +01:00
public Initial commit 2025-12-06 11:23:06 +01:00
src add clipboard copy 2026-07-16 16:09:42 +02:00
templates done 2026-07-16 15:56:04 +02:00
tests add clipboard copy 2026-07-16 16:09:42 +02:00
translations Initial commit 2025-12-06 11:23:06 +01:00
.editorconfig Initial commit 2025-12-06 11:23:06 +01:00
.env on going more info 2025-12-07 12:22:43 +01:00
.env.dev Initial commit 2025-12-06 11:23:06 +01:00
.env.test Initial commit 2025-12-06 11:23:06 +01:00
.gitignore Initial commit 2025-12-06 11:23:06 +01:00
Caddyfile update 2026-06-14 21:58:18 +02:00
CLAUDE.md update doc 2026-07-16 14:54:01 +02:00
compose.override.yaml update 2026-06-14 21:58:18 +02:00
compose.yaml update 2026-06-14 21:58:18 +02:00
composer.json update 2026-06-14 21:58:18 +02:00
composer.lock done 2026-07-16 15:56:04 +02:00
deploy.sh add deploy script 2025-12-07 11:59:25 +00:00
Dockerfile update 2026-06-14 21:58:18 +02:00
importmap.php add localisation 2025-12-19 19:15:04 +01:00
phpunit.dist.xml Initial commit 2025-12-06 11:23:06 +01:00
README.md update doc 2026-07-16 14:54:01 +02:00
symfony.lock feat : add bundle, clean useless code 2025-12-30 13:12:38 +01:00

parking-pmr

Application Symfony 7.4 (PHP 8.2+) qui affiche sur une carte Leaflet / OpenStreetMap les places de parking PMR (personnes à mobilité réduite) récupérées depuis une API REST externe. Les adresses proches sont enrichies via l'API de géocodage de la Géoplateforme (IGN).

Architecture : Hexagonale (Ports & Adapters)

Les dépendances pointent vers l'intérieur : le Domain ne connaît ni le framework ni HTTP. Le câblage est autowiré via config/services.yaml.

  • Domain (src/Domain/) — cœur métier pur, sans dépendance framework
    • Model/ — objets métier (ParkingModel, CoordinateModel, AdresseProcheModel)
    • ServiceInterface/ + ServiceImpl/ — cas d'usage : GetAllParkings, UxMap, BulkLoadAdresseProche
    • ProviderInterface/ — ports d'accès aux données (ex. ParkingProviderInterface)
    • Util/SvgIcon.php — génère les icônes SVG des marqueurs (rouge = complet, vert = disponible, bleu = inconnu)
  • Infrastructure (src/Infrastructure/) — adaptateurs implémentant les ports
    • Repository/ — clients HTTP (ApiParkingRepository, ApiGeoPlatformRepository), résilients (renvoient [] en cas d'erreur réseau/JSON)
    • Model/ — DTO désérialisés depuis les API externes
    • Mapper/ — conversion DTO Infrastructure ↔ modèles Domain
    • ProviderImpl/ — implémentent les ports en composant un Repository + un Mapper
  • Interface utilisateur (Symfony Controllers + Twig)
    • HomeController — routes / et /localisation, transmet la carte au template
    • BulkController — routes /admin/bulk/{load,show,delete} pour le géocodage en masse
    • templates/home/index.html.twig — affiche la carte (composant UX Map) et la liste des parkings
  • Persistance (src/Entity/ + src/Repository/) — Doctrine/MySQL, utilisé uniquement pour l'authentification (User) et le cache des adresses géocodées (AdresseProcheOrigin)

Flux principaux

  1. Affichage : HomeControllerGetAllParkingsApiParkingProvider (Repository HTTP + ParkingMapper) → UxMap construit une Symfony\UX\Map\Map avec marqueurs colorés → Twig.
  2. Géocodage en masse : BulkControllerBulkLoadAdresseProche → récupère les parkings, extrait les coordonnées, interroge la Géoplateforme, persiste via AdresseProcheOriginProvider.

Configuration

Dans .env.local :

PARKING_API_URL="https://exemple.tld/api/parkings"
GEO_PLATFORM_API_URL="https://data.geopf.fr/geocodage/..."
DATABASE_URL="mysql://user:pass@127.0.0.1:3306/parking_pmr?serverVersion=8.0"

Ces valeurs sont injectées dans les repositories via les paramètres parking.api_url et geo_platform.api_url de config/services.yaml. L'application reste fonctionnelle (liste vide) si PARKING_API_URL n'est pas renseignée.

Lancer l'application

symfony serve                                  # serveur de dev
php bin/console doctrine:migrations:migrate    # base de données

Accéder à /. Si l'URL d'API renvoie des éléments avec latitude/longitude, les places s'affichent sur la carte, centrée par défaut sur Montpellier.

Tests

php bin/phpunit                                          # suite complète
php bin/phpunit tests/Domain/ServiceImpl/UxMapTest.php   # un fichier
php bin/phpunit --filter testMethodName                  # un test

La configuration PHPUnit échoue sur toute dépréciation, notice ou warning (failOnDeprecation, failOnNotice, failOnWarning).