Skip to content

Pi-R-Pa/api-platform-skeleton

Repository files navigation

API Platform Skeleton

Skeleton API First et Mobile First pour démarrer rapidement un projet assisté par IA, basé sur le skeleton officiel API Platform 4.3.

Ce dépôt est un monorepo open source destiné aux développeurs qui souhaitent un point de départ opinioné mais générique. Il fournit :

  • api/ — backend Symfony / API Platform (PHP 8.5, FrankenPHP)
  • pwa/ — frontend Next.js (MUI)
  • une authentification de référence (JWT + SSO Google/Microsoft, vérification email)
  • un outillage qualité prêt à l'emploi (PHPStan, php-cs-fixer, Rector, Playwright, pre-push hook)
  • une CI/CD GitHub Actions + chart Helm pour Kubernetes

Table des matières


Stack technique

Backend (api/)

Composant Technologie Version
Langage PHP 8.5
Framework Symfony 7.4
API API Platform 4.3
Serveur web FrankenPHP (worker mode) latest
Base de données PostgreSQL 16
Cache / Sessions Redis 7
Auth JWT RS256 (lexik/jwt-authentication-bundle) + SSO Google / Microsoft
Push (roadmap) Firebase Cloud Messaging (kreait/firebase-php packagé, câblage applicatif à faire)
Scheduler Symfony Scheduler
Bus de messages Symfony Messenger + RabbitMQ

Frontend (pwa/)

Composant Technologie
Framework Next.js 15 (React 19)
Rendu Pages Router (SSR / SSG site vitrine + CSR application)
Styling Material Design (MUI v9)
Push web (roadmap) Web Push API (VAPID) — clé exposée, service worker à implémenter

Architecture

API First & Mobile First

L'application est API First : toutes les fonctionnalités sont exposées via l'API REST avant d'être consommées par les clients (application mobile, frontend web). L'expérience utilisateur est pensée Mobile First.

Deux surfaces frontend

Surface Rendu Auth SEO / GEO Contenu
Site vitrine SSR / SSG (Server-Side Rendering) Non ✅ Optimisé Google + agents IA Pages marketing publiques (à customiser selon vos personas)
Application CSR (Client-Side Rendering) Oui (JWT) ❌ Non indexable Dashboard et fonctionnalités métier (à implémenter)

Le site vitrine est pré-rendu côté serveur pour garantir un référencement optimal sur les moteurs de recherche classiques (Google) et les moteurs de réponse IA (GEO — Generative Engine Optimization). L'application métier, protégée par authentification, est rendue côté client pour une expérience interactive fluide.

Domain Driven Design (DDD)

Le code source du backend suit une architecture DDD organisée par contextes bornés (bounded contexts). Le skeleton fournit le contexte Identity comme exemple de référence ; ajoutez vos propres contextes métier en suivant la même structure.

Contexte Statut Responsabilité
Identity Fourni Gestion des utilisateurs, inscription, vérification email, JWT, SSO
<YourContext> À ajouter Vos contextes métier (un dossier par contexte sous api/src/)

CQRS

Le projet utilise le pattern CQRS via Symfony Messenger :

  • command.bus — synchrone + asynchrone (écriture, effets de bord)
  • query.bus — synchrone uniquement (lecture)

Multi-tenant (roadmap, mono base par client)

Le skeleton fonctionne en mode mono-tenant par défaut. Le multi-tenant (une base PostgreSQL par client, résolution via JWT ou sous-domaine) est un pattern documenté à implémenter par chaque projet — aucun résolveur de tenant n'est fourni en l'état.


Prérequis

Aucune installation locale de PHP ou Node n'est nécessaire pour le développement.


Démarrage rapide (dev)

1. Cloner le dépôt

git clone <repo-url>
cd api-platform-skeleton

2. Copier les variables d'environnement

cp api/.env api/.env.local
cp pwa/.env.local.example pwa/.env.local
# Éditer les deux fichiers selon votre configuration locale

3. Générer les clés JWT

docker compose run --rm php sh -c "
  mkdir -p config/jwt &&
  openssl genrsa -out config/jwt/private.pem 4096 &&
  openssl rsa -in config/jwt/private.pem -pubout -out config/jwt/public.pem
"

4. Démarrer les services

docker compose up -d

5. Activer les hooks Git locaux

git config core.hooksPath .githooks

Services disponibles après démarrage :

Service URL locale Description
php https://localhost API (FrankenPHP + Caddy intégré)
pwa https://localhost Frontend Next.js (proxifié par Caddy depuis pwa:3000)
database localhost:5432 Base de données PostgreSQL
redis localhost:6379 Cache et sessions Redis
mailpit http://localhost:8025 Catch-all mail (dev uniquement)

6. Initialiser la base de données

docker compose exec php bin/console doctrine:migrations:migrate --no-interaction

7. Vérifier

curl -k https://localhost/api
# Doit retourner le JSON-LD de l'entrypoint API Platform

Variables d'environnement

Backend (api/.env.local)

Variable Description Exemple
APP_ENV Environnement applicatif dev / prod
APP_SECRET Secret Symfony chaîne aléatoire 32 chars
DATABASE_URL DSN PostgreSQL (tenant par défaut) postgresql://user:pass@database:5432/app
REDIS_URL DSN Redis redis://redis:6379
JWT_SECRET_KEY Chemin vers la clé privée JWT %kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY Chemin vers la clé publique JWT %kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE Passphrase de la clé privée JWT
FIREBASE_CREDENTIALS Chemin ou JSON des credentials FCM (push)
MAILER_DSN DSN du mailer smtp://mailpit:1025
MAILER_FROM Expéditeur des emails transactionnels no-reply@example.com

Frontend (pwa/.env.local)

Variable Description Exemple
NEXT_PUBLIC_API_URL URL de base de l'API (sans suffixe /api — les endpoints sont concaténés par pwa/lib/api.ts) https://localhost
NEXT_PUBLIC_GOOGLE_CLIENT_ID Client ID OAuth Google pour le SSO
NEXT_PUBLIC_MICROSOFT_CLIENT_ID Client ID OAuth Microsoft pour le SSO
NEXT_PUBLIC_VAPID_KEY Clé publique VAPID pour les notifications web push (roadmap)

Structure du projet

api-platform-skeleton/                   # Monorepo (skeleton API Platform 4.3)
├── api/                                 # Backend Symfony / API Platform
│   ├── config/
│   │   ├── jwt/                         # Clés JWT (private.pem, public.pem)
│   │   ├── packages/                    # Config des bundles (doctrine, messenger, security…)
│   │   ├── routes/
│   │   └── services.yaml
│   ├── public/                          # Point d'entrée web (index.php)
│   ├── src/
│   │   ├── Identity/                    # Bounded context d'exemple : utilisateurs & auth
│   │   │   ├── Auth/                    # Controllers SSO + UserProvider + RefreshToken
│   │   │   ├── Entity/                  # User
│   │   │   ├── Event/                   # UserRegistered, EmailVerified
│   │   │   ├── EventListener/           # RateLimitListener, SendVerificationEmailListener
│   │   │   ├── Handler/                 # RegisterUserHandler, VerifyEmailHandler (CQRS — bus Messenger)
│   │   │   ├── Provider/                # MeProvider (API Platform state provider)
│   │   │   ├── Repository/              # UserRepositoryInterface, UserRepository
│   │   │   ├── Resource/                # MeOutput, RegistrationInput/Output, VerifyEmailInput/Output
│   │   │   ├── Type/                    # EmailType, HashedPasswordType, UserIdType, VerificationTokenType
│   │   │   └── ValueObject/             # UserId, Email, HashedPassword, VerificationToken
│   │   ├── Technical/                   # Helpers transverses
│   │   ├── Schedule.php                 # Définition Symfony Scheduler
│   │   ├── Kernel.php
│   │   └── <YourContext>/               # Ajoutez ici vos contextes métier
│   ├── tests/
│   │   ├── Unit/                        # Tests unitaires par bounded context
│   │   └── Integration/                 # Tests d'intégration (Doctrine, Redis…)
│   ├── composer.json
│   ├── phpstan.neon
│   └── .php-cs-fixer.php
├── pwa/                                 # Frontend Next.js — voir pwa/README.md
├── helm/                                # Helm charts Kubernetes (fournis par le skeleton)
├── .github/
│   └── workflows/                       # Pipelines GitHub Actions (CI + déploiement)
└── compose.yaml                         # Docker Compose (fourni par le skeleton)

Convention DDD : les entités du domaine sont des objets PHP avec mapping Doctrine via attributs PHP (pas de fichiers de mapping XML applicatifs).


Tests

# Tous les tests
docker compose exec php bin/phpunit

# Par suite
docker compose exec php bin/phpunit --testsuite unit
docker compose exec php bin/phpunit --testsuite integration

# Avec couverture HTML (nécessite Xdebug ou PCOV)
docker compose exec php bin/phpunit --coverage-html var/coverage

Outils de qualité

# Analyse statique — PHPStan niveau 8
docker compose exec php vendor/bin/phpstan analyse

# Style de code — PSR-12 + règles Symfony
docker compose exec php vendor/bin/php-cs-fixer fix --dry-run --diff
docker compose exec php vendor/bin/php-cs-fixer fix   # correction automatique

# Refactoring automatisé — Rector
docker compose exec php vendor/bin/rector process --dry-run

Outils MCP

Le skeleton embarque une configuration Model Context Protocol (mcp.json) qui expose cinq serveurs MCP prêts à l'emploi pour les agents IA (Claude Code, Cursor, etc.).

Serveur Périmètre Transport
postgres Analyse et optimisation de la base de données PostgreSQL (santé, requêtes lentes, recommandations d'index, exécution SQL) SSE — http://postgres-mcp:8000/sse
redis Inspection et manipulation du cache Redis (clés, structures de données, pub/sub) stdio (mcp/redis)
symfony-ai-mate Outils PHP natifs : logs Monolog structurés, commandes Symfony/Doctrine, analyse du code, introspection du serveur stdio (./vendor/bin/mate)
context7 Documentation à jour des bibliothèques et frameworks utilisés dans le projet stdio (npx via conteneur pwa)
mui-mcp Composants MUI v9 : recherche, props, exemples de code stdio (npx via conteneur pwa)

Les serveurs postgres et redis démarrent automatiquement avec docker compose up. Les serveurs stdio (symfony-ai-mate, context7, mui-mcp) sont lancés à la demande par le client MCP.

Convention : préférez toujours les outils MCP aux commandes CLI brutes (docker compose exec php bin/console …, tail -f var/log/dev.log, etc.). L'agent symfony-ai-mate fournit des équivalents structurés pour la quasi-totalité des commandes courantes.

Pour le détail des outils exposés par chaque serveur, voir api/POSTGRES_MCP.md et api/mate/AGENT_INSTRUCTIONS.md.


Déploiement

Environnements

Environnement Branche Déclencheur
Staging develop Push sur develop
Production main Tag v*.*.*

Pipeline GitHub Actions

Push / Tag
    │
    ├─ Lint & Tests
    │     ├─ PHPStan (analyse statique)
    │     ├─ PHP-CS-Fixer (style)
    │     └─ PHPUnit (unit + integration + contract)
    │
    ├─ Build & Push
    │     └─ Build images Docker (php + pwa) → push vers registry (GHCR)
    │
    └─ Deploy Kubernetes
          ├─ helm upgrade --install api-platform-skeleton ./helm
          └─ kubectl rollout status deployment/api-platform-skeleton-php

Kubernetes (Helm)

Les charts dans helm/ (fournis par le skeleton API Platform et customisés) définissent :

Ressource Rôle
Deployment php FrankenPHP en worker mode (zero-downtime rolling update)
Deployment pwa Conteneur Next.js
Service Exposition interne des pods
Ingress Terminaison TLS + routing HTTP
ConfigMap Variables d'environnement non sensibles
Secret Credentials sensibles (JWT keys, DB, Firebase)

Les secrets sont injectés via envFrom / valueFrom.secretKeyRef — aucune valeur sensible ne doit être committée dans le dépôt.


Documentation complémentaire

Document Description
docs/architecture.md Schémas d'architecture (Mermaid) — DDD, CQRS, infrastructure
docs/adr/ Architecture Decision Records
api/README.md Documentation détaillée du backend
pwa/README.md Documentation détaillée du frontend Next.js

About

Skeleton to start developping an API first project, based on API Platform

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors