- PHP 79.6%
- Twig 13%
- JavaScript 3.1%
- CSS 2.9%
- Dockerfile 0.8%
- Other 0.6%
|
|
||
|---|---|---|
| .claude | ||
| .idea | ||
| assets | ||
| bin | ||
| config | ||
| docker/db | ||
| frankenphp | ||
| migrations | ||
| public | ||
| src | ||
| templates | ||
| tests | ||
| translations | ||
| .editorconfig | ||
| .env | ||
| .env.dev | ||
| .env.test | ||
| .gitignore | ||
| Caddyfile | ||
| CLAUDE.md | ||
| compose.override.yaml | ||
| compose.yaml | ||
| composer.json | ||
| composer.lock | ||
| deploy.sh | ||
| Dockerfile | ||
| importmap.php | ||
| phpunit.dist.xml | ||
| README.md | ||
| symfony.lock | ||
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 frameworkModel/— objets métier (ParkingModel,CoordinateModel,AdresseProcheModel)ServiceInterface/+ServiceImpl/— cas d'usage :GetAllParkings,UxMap,BulkLoadAdresseProcheProviderInterface/— 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 portsRepository/— clients HTTP (ApiParkingRepository,ApiGeoPlatformRepository), résilients (renvoient[]en cas d'erreur réseau/JSON)Model/— DTO désérialisés depuis les API externesMapper/— conversion DTO Infrastructure ↔ modèles DomainProviderImpl/— implémentent les ports en composant un Repository + un Mapper
- Interface utilisateur (Symfony Controllers + Twig)
HomeController— routes/et/localisation, transmet la carte au templateBulkController— routes/admin/bulk/{load,show,delete}pour le géocodage en massetemplates/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
- Affichage :
HomeController→GetAllParkings→ApiParkingProvider(Repository HTTP +ParkingMapper) →UxMapconstruit uneSymfony\UX\Map\Mapavec marqueurs colorés → Twig. - Géocodage en masse :
BulkController→BulkLoadAdresseProche→ récupère les parkings, extrait les coordonnées, interroge la Géoplateforme, persiste viaAdresseProcheOriginProvider.
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).