PHPackages                             ramexdeltaxoo/symfony-api-starter - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. ramexdeltaxoo/symfony-api-starter

ActiveProject[API Development](/categories/api)

ramexdeltaxoo/symfony-api-starter
=================================

04PHP

Since May 28Pushed 1mo agoCompare

[ Source](https://github.com/RamexDeltaXOO/symfony-api-starter)[ Packagist](https://packagist.org/packages/ramexdeltaxoo/symfony-api-starter)[ RSS](/packages/ramexdeltaxoo-symfony-api-starter/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependenciesVersions (1)Used By (0)

Symfony API Starter - CheatSheet LockSelf
=========================================

[](#symfony-api-starter---cheatsheet-lockself)

1. Créer un nouveau projet depuis Packagist
-------------------------------------------

[](#1-créer-un-nouveau-projet-depuis-packagist)

```
composer create-project ramexdeltaxoo/symfony-api-starter lockself-projet dev-main
```

---

2. Entrer dans le projet
========================

[](#2-entrer-dans-le-projet)

```
cd lockself-projet
```

---

3. Nettoyer la base SQLite (optionnel mais conseillé)
=====================================================

[](#3-nettoyer-la-base-sqlite-optionnel-mais-conseillé)

Windows CMD
-----------

[](#windows-cmd)

```
del var\data.db
del migrations\*.php
```

---

4. Créer une nouvelle migration
===============================

[](#4-créer-une-nouvelle-migration)

```
php bin/console make:migration
```

---

5. Exécuter les migrations
==========================

[](#5-exécuter-les-migrations)

```
php bin/console doctrine:migrations:migrate
```

Répondre :

```
yes
```

---

6. Vérifier les routes API
==========================

[](#6-vérifier-les-routes-api)

```
php bin/console debug:router
```

Tu dois voir :

```
GET      /api/secure-notes
POST     /api/secure-notes
GET      /api/secure-notes/{id}
PUT      /api/secure-notes/{id}
DELETE   /api/secure-notes/{id}
```

---

7. Lancer les tests PHPUnit
===========================

[](#7-lancer-les-tests-phpunit)

```
php bin/phpunit
```

Résultat attendu :

```
OK (1 test, 1 assertion)
```

---

8. Lancer le serveur Symfony
============================

[](#8-lancer-le-serveur-symfony)

Méthode Windows simple
----------------------

[](#méthode-windows-simple)

```
php -S 127.0.0.1:8000 -t public
```

---

9. Ouvrir l'API
===============

[](#9-ouvrir-lapi)

```
http://127.0.0.1:8000/api/secure-notes
```

---

10. Créer une nouvelle Entity
=============================

[](#10-créer-une-nouvelle-entity)

```
php bin/console make:entity
```

Exemple :

```
Class name:
> Category
```

---

11. Ajouter un champ dans une Entity
====================================

[](#11-ajouter-un-champ-dans-une-entity)

Exemple :

```
New property name:
> name

Field type:
> string

Field length:
> 255
```

---

12. Créer un utilisateur
========================

[](#12-créer-un-utilisateur)

```
php bin/console make:user
```

Réponses :

```
Class name:
> User

Store in database:
> yes

Unique property:
> email
```

---

13. Créer une migration après modification Entity
=================================================

[](#13-créer-une-migration-après-modification-entity)

```
php bin/console make:migration
```

---

14. Appliquer migration
=======================

[](#14-appliquer-migration)

```
php bin/console doctrine:migrations:migrate
```

---

15. Créer un Controller
=======================

[](#15-créer-un-controller)

```
php bin/console make:controller Api/CategoryController
```

---

16. Créer un Test
=================

[](#16-créer-un-test)

```
php bin/console make:test
```

Choisir :

```
WebTestCase
```

---

17. Vérifier les services
=========================

[](#17-vérifier-les-services)

Symfony autowire automatiquement toutes les classes dans :

```
src/
```

Exemple :

```
src/Service
src/Repository
src/Security
```

---

18. Architecture Symfony à retenir
==================================

[](#18-architecture-symfony-à-retenir)

```
Controller
→ HTTP / JSON / Routes

Service
→ logique métier

Repository
→ requêtes Doctrine

DTO
→ validation input API

Voter
→ permissions sécurité

Entity
→ modèle base de données
```

---

19. Commandes Git utiles
========================

[](#19-commandes-git-utiles)

Initialiser Git
---------------

[](#initialiser-git)

```
git init
```

Ajouter les fichiers
--------------------

[](#ajouter-les-fichiers)

```
git add .
```

Commit
------

[](#commit)

```
git commit -m "Initial commit"
```

Push GitHub
-----------

[](#push-github)

```
git push -u origin main
```

---

20. Créer une version stable Composer
=====================================

[](#20-créer-une-version-stable-composer)

```
git tag v1.0.0
git push origin v1.0.0
```

Puis cliquer sur :

```
Update
```

dans Packagist.

---

21. Utiliser ensuite sans dev-main
==================================

[](#21-utiliser-ensuite-sans-dev-main)

```
composer create-project ramexdeltaxoo/symfony-api-starter mon-projet
```

---

22. Les phrases senior importantes
==================================

[](#22-les-phrases-senior-importantes)

Service
-------

[](#service)

> Je préfère garder des controllers très fins et déplacer la logique métier dans des services.

DTO
---

[](#dto)

> J’utilise des DTO pour éviter d’exposer directement mes Entities Doctrine.

Voter
-----

[](#voter)

> Le Voter centralise la logique d’autorisation.

Architecture
------------

[](#architecture)

> J’ai privilégié une architecture simple mais maintenable vu le temps imparti.

---

23. Concepts importants
=======================

[](#23-concepts-importants)

Autowiring
----------

[](#autowiring)

Symfony injecte automatiquement les dépendances grâce au type des classes.

strict\_types
-------------

[](#strict_types)

```
declare(strict_types=1);
```

Permet d’éviter les conversions implicites de types.

CQRS
----

[](#cqrs)

Séparation lecture / écriture.

Pas nécessaire pour un test technique court.

---

24. Workflow recommandé pendant un test technique
=================================================

[](#24-workflow-recommandé-pendant-un-test-technique)

```
1. Entity
2. Migration
3. Controller CRUD
4. DTO
5. Service
6. Repository
7. Voter
8. Test
```

---

25. Règle d’or
==============

[](#25-règle-dor)

```
Faire SIMPLE mais PROPRE.
```

26. Questions probables pendant le test technique
=================================================

[](#26-questions-probables-pendant-le-test-technique)

Pourquoi avoir créé un Service ?
--------------------------------

[](#pourquoi-avoir-créé-un-service-)

> Pour éviter de mettre la logique métier dans le controller et garder des controllers très fins.

---

Pourquoi utiliser un DTO ?
--------------------------

[](#pourquoi-utiliser-un-dto-)

> Pour valider les données entrantes sans exposer directement les Entities Doctrine.

---

Pourquoi séparer CreateDto et UpdateDto ?
-----------------------------------------

[](#pourquoi-séparer-createdto-et-updatedto-)

> Parce que les contraintes de validation peuvent être différentes entre création et modification.

---

Pourquoi un Repository ?
------------------------

[](#pourquoi-un-repository-)

> Pour centraliser les requêtes spécifiques liées à l’Entity.

Exemple :

```
findByOwner()
```

---

Pourquoi un Voter ?
-------------------

[](#pourquoi-un-voter-)

> Pour centraliser la logique d’autorisation sur une ressource.

---

Pourquoi `denyAccessUnlessGranted()` ?
--------------------------------------

[](#pourquoi-denyaccessunlessgranted-)

> Pour déléguer la logique de sécurité au système de Voter Symfony.

---

Pourquoi `MapRequestPayload` ?
------------------------------

[](#pourquoi-maprequestpayload-)

> Pour mapper automatiquement le JSON entrant vers un DTO validé.

---

Pourquoi `readonly` ?
---------------------

[](#pourquoi-readonly-)

> Pour garantir que les dépendances injectées ne changent pas après construction.

---

Pourquoi `final` ?
------------------

[](#pourquoi-final-)

> Pour éviter l’héritage inutile et garder un comportement prévisible.

---

Pourquoi `DateTimeImmutable` ?
------------------------------

[](#pourquoi-datetimeimmutable-)

> Pour éviter les modifications involontaires des objets date.

---

Pourquoi `persist()` uniquement à la création ?
-----------------------------------------------

[](#pourquoi-persist-uniquement-à-la-création-)

> Parce qu’une Entity déjà gérée par Doctrine n’a pas besoin d’être persistée à nouveau.

---

Pourquoi SQLite ?
-----------------

[](#pourquoi-sqlite-)

> SQLite permet de démarrer rapidement sans configuration serveur et convient parfaitement à un test technique.

---

Différence entre Entity et DTO ?
--------------------------------

[](#différence-entre-entity-et-dto-)

```
Entity = modèle base de données
DTO = données d’entrée/sortie API
```

---

Différence entre 401 et 403 ?
-----------------------------

[](#différence-entre-401-et-403-)

```
401 = non authentifié
403 = authentifié mais non autorisé
```

---

Pourquoi utiliser des groupes Serializer ?
------------------------------------------

[](#pourquoi-utiliser-des-groupes-serializer-)

Exemple :

```
['groups' => ['note:read']]
```

> Pour contrôler les données exposées dans les réponses JSON.

---

Pourquoi ne pas retourner directement toute l’Entity ?
------------------------------------------------------

[](#pourquoi-ne-pas-retourner-directement-toute-lentity-)

> Pour éviter d’exposer des données sensibles ou des relations inutiles.

---

C’est quoi l’autowiring ?
-------------------------

[](#cest-quoi-lautowiring-)

> Symfony injecte automatiquement les dépendances grâce au type des classes.

---

C’est quoi Doctrine ?
---------------------

[](#cest-quoi-doctrine-)

> Doctrine est un ORM qui permet de mapper des objets PHP vers des tables SQL.

---

C’est quoi une migration Doctrine ?
-----------------------------------

[](#cest-quoi-une-migration-doctrine-)

> Une migration permet de versionner les modifications de schéma de base de données.

---

Pourquoi utiliser des tests ?
-----------------------------

[](#pourquoi-utiliser-des-tests-)

> Pour vérifier le comportement attendu de l’application et éviter les régressions.

---

Pourquoi avoir testé le 401 ?
-----------------------------

[](#pourquoi-avoir-testé-le-401-)

> Parce que c’est un test simple qui valide que la sécurité est correctement appliquée.

---

Pourquoi ne pas utiliser API Platform ?
---------------------------------------

[](#pourquoi-ne-pas-utiliser-api-platform-)

> Pour ce test, je voulais montrer explicitement la structure complète Symfony : Controller, Service, DTO, Repository et sécurité.

---

C’est quoi CQRS ?
-----------------

[](#cest-quoi-cqrs-)

> CQRS consiste à séparer les opérations de lecture et d’écriture.

---

Pourquoi ne pas avoir utilisé CQRS ici ?
----------------------------------------

[](#pourquoi-ne-pas-avoir-utilisé-cqrs-ici-)

> Vu le temps imparti, j’ai préféré garder une architecture simple et maintenable.

---

Pourquoi injecter les dépendances via le constructeur ?
-------------------------------------------------------

[](#pourquoi-injecter-les-dépendances-via-le-constructeur-)

> Cela rend les dépendances explicites, facilement testables et compatibles avec l’autowiring Symfony.

---

Que ferais-tu avec plus de temps ?
----------------------------------

[](#que-ferais-tu-avec-plus-de-temps-)

> Pagination, gestion centralisée des erreurs, tests supplémentaires, PHPStan, PHP-CS-Fixer, CI/CD et éventuellement JWT/API Platform selon le besoin.

---

27. Questions Symfony techniques rapides
========================================

[](#27-questions-symfony-techniques-rapides)

Commande pour créer une Entity
------------------------------

[](#commande-pour-créer-une-entity)

```
php bin/console make:entity
```

---

Commande pour créer une migration
---------------------------------

[](#commande-pour-créer-une-migration)

```
php bin/console make:migration
```

---

Commande pour exécuter les migrations
-------------------------------------

[](#commande-pour-exécuter-les-migrations)

```
php bin/console doctrine:migrations:migrate
```

---

Commande pour afficher les routes
---------------------------------

[](#commande-pour-afficher-les-routes)

```
php bin/console debug:router
```

---

Commande pour lancer les tests
------------------------------

[](#commande-pour-lancer-les-tests)

```
php bin/phpunit
```

---

Commande pour créer un Controller
---------------------------------

[](#commande-pour-créer-un-controller)

```
php bin/console make:controller
```

---

Commande pour créer un User
---------------------------

[](#commande-pour-créer-un-user)

```
php bin/console make:user
```

---

28. Les erreurs fréquentes à connaître
======================================

[](#28-les-erreurs-fréquentes-à-connaître)

`could not find driver`
-----------------------

[](#could-not-find-driver)

> Extension PDO SQLite ou MySQL manquante dans PHP.

---

`table already exists`
----------------------

[](#table-already-exists)

> La base SQLite contient déjà les tables. Supprimer `var/data.db` puis recréer les migrations.

---

`src refspec main does not match any`
-------------------------------------

[](#src-refspec-main-does-not-match-any)

> Aucun commit Git n’a encore été créé.

---

`Class already in use`
----------------------

[](#class-already-in-use)

> Deux classes avec le même namespace existent dans le projet.

---

`Could not find package with stability stable`
----------------------------------------------

[](#could-not-find-package-with-stability-stable)

> Le package Composer n’a pas encore de version stable. Utiliser `dev-main`.

---

29. Ce qu’il faut retenir absolument
====================================

[](#29-ce-quil-faut-retenir-absolument)

```
Controller = HTTP
Service = métier
Repository = requêtes
DTO = validation
Voter = permissions
Entity = base de données
```

---

30. Mentalité senior pendant le test
====================================

[](#30-mentalité-senior-pendant-le-test)

```
- Faire simple
- Faire propre
- Livrer quelque chose qui fonctionne
- Expliquer ses choix
- Ne pas over-engineer
```

###  Health Score

20

—

LowBetter than 12% of packages

Maintenance59

Moderate activity, may be stable

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity11

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/30215241?v=4)[RamexDeltaXOO](/maintainers/RamexDeltaXOO)[@RamexDeltaXOO](https://github.com/RamexDeltaXOO)

---

Top Contributors

[![RamexDeltaXOO](https://avatars.githubusercontent.com/u/30215241?v=4)](https://github.com/RamexDeltaXOO "RamexDeltaXOO (6 commits)")

### Embed Badge

![Health badge](/badges/ramexdeltaxoo-symfony-api-starter/health.svg)

```
[![Health](https://phpackages.com/badges/ramexdeltaxoo-symfony-api-starter/health.svg)](https://phpackages.com/packages/ramexdeltaxoo-symfony-api-starter)
```

###  Alternatives

[exsyst/swagger

A php library to manipulate Swagger specifications

35916.4M7](/packages/exsyst-swagger)[hubspot/api-client

Hubspot API client

24016.2M20](/packages/hubspot-api-client)[pocketmine/bedrock-protocol

An implementation of the Minecraft: Bedrock Edition protocol in PHP

172445.0k18](/packages/pocketmine-bedrock-protocol)[botman/driver-telegram

Telegram driver for BotMan

93459.5k6](/packages/botman-driver-telegram)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
