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
- Stack technique
- Architecture
- Prérequis
- Démarrage rapide (dev)
- Variables d'environnement
- Structure du projet
- Tests
- Outils de qualité
- Outils MCP
- Déploiement
- Documentation complémentaire
| 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 | — |
| 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 |
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.
| 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.
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/) |
Le projet utilise le pattern CQRS via Symfony Messenger :
command.bus— synchrone + asynchrone (écriture, effets de bord)query.bus— synchrone uniquement (lecture)
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.
- Docker ≥ 24
- Docker Compose ≥ 2.20
make(optionnel, pour les raccourcis)
Aucune installation locale de PHP ou Node n'est nécessaire pour le développement.
git clone <repo-url>
cd api-platform-skeletoncp api/.env api/.env.local
cp pwa/.env.local.example pwa/.env.local
# Éditer les deux fichiers selon votre configuration localedocker 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
"docker compose up -dgit config core.hooksPath .githooksServices 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) |
docker compose exec php bin/console doctrine:migrations:migrate --no-interactioncurl -k https://localhost/api
# Doit retourner le JSON-LD de l'entrypoint API Platform| 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 |
| 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) | — |
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).
# 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# 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-runLe 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'agentsymfony-ai-matefournit 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.
| Environnement | Branche | Déclencheur |
|---|---|---|
| Staging | develop |
Push sur develop |
| Production | main |
Tag v*.*.* |
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
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.
| 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 |