4.4 KiB
Mini-CRM — TP9 + TP10
Ce ZIP contient les fichiers à ajouter/remplacer dans le projet mini-crm
du dépôt yolou/BUT2.
Ce que j'ai fait — TP9
- J'ai activé le routage API dans
bootstrap/app.php. - J'ai créé
routes/api.php. - J'ai ajouté
GET /api/test. - J'ai créé un contrôleur séparé
Api/ClientController. - J'ai ajouté
GET /api/clientspour récupérer les clients. - J'ai ajouté
GET /api/clients/{client}avec le route model binding. - J'ai ajouté
POST /api/clientspour créer un client. - J'ai validé
name,email,phoneetcity. - Comme la migration du projet impose un email unique, j'ai ajouté la règle
unique:clients,email. - J'ai réalisé le défi autonome :
GET /api/clients/search?email=.... - Si aucun email ne correspond, l'API renvoie 404.
Ce que j'ai fait — TP10
- J'ai créé
ClientResourceafin de maîtriser le JSON exposé. - J'utilise la Resource pour la liste, le détail, la création et la modification.
- J'ai ajouté
PATCH /api/clients/{client}. - Pour PATCH, j'utilise
sometimesafin de permettre une modification partielle. - Pour l'email, j'ignore l'identifiant du client courant lors du contrôle d'unicité.
- J'ai ajouté
DELETE /api/clients/{client}. - Une suppression réussie renvoie HTTP 204 No Content.
- J'ai réalisé le défi de pagination avec
Client::paginate(10).
Installation dans ton projet
Copie le contenu de ce dossier dans :
C:\Users\Junior\Desktop\laraveltp\mini_crm_aylane
en conservant l'arborescence.
Les fichiers principaux sont :
bootstrap/app.phproutes/api.phpapp/Http/Controllers/Api/ClientController.phpapp/Http/Resources/ClientResource.php
Le modèle app/Models/Client.php de ton dépôt possède déjà les champs fillable
name, email, phone, city, donc il n'a pas besoin d'être remplacé.
Commandes à lancer
php artisan optimize:clear
php artisan route:list --path=api
php artisan serve
Le sujet propose
php artisan install:api, notamment pour installer Sanctum. Ici Sanctum n'est pas nécessaire au fonctionnement demandé dans les TP9/TP10 : le routage API est déclaré directement dansbootstrap/app.php. Le TP10 demande justement de ne pas mettre en place un nouveau système d'authentification pour cette partie pédagogique.
Routes attendues
| Méthode | URL | Rôle |
|---|---|---|
| GET | /api/test |
Vérifier l'API |
| GET | /api/clients |
Clients paginés (10/page) |
| GET | /api/clients/search?email=... |
Recherche par email |
| GET | /api/clients/{client} |
Détail d'un client |
| POST | /api/clients |
Créer un client |
| PATCH | /api/clients/{client} |
Modifier partiellement |
| DELETE | /api/clients/{client} |
Supprimer |
Tests rapides
Créer
curl -X POST http://127.0.0.1:8000/api/clients ^
-H "Content-Type: application/json" ^
-H "Accept: application/json" ^
-d "{\"name\":\"Thomas Leroy\",\"email\":\"thomas@example.com\",\"city\":\"Paris\"}"
Résultat attendu : 201 Created.
Modifier
curl -X PATCH http://127.0.0.1:8000/api/clients/1 ^
-H "Content-Type: application/json" ^
-H "Accept: application/json" ^
-d "{\"name\":\"Jean Dupont Modifié\"}"
Résultat attendu : 200 OK.
Supprimer
curl -X DELETE http://127.0.0.1:8000/api/clients/1 -H "Accept: application/json"
Résultat attendu : 204 No Content.
Pagination
Ouvrir :
http://127.0.0.1:8000/api/clients?page=1
puis :
http://127.0.0.1:8000/api/clients?page=2
Réponses sécurité TP10
- Dans un vrai CRM, les routes de consultation, création, modification et suppression des clients devraient être protégées car elles manipulent des données privées ou permettent de les modifier.
- POST est sensible car un utilisateur non autorisé pourrait créer de fausses données dans la base.
- Cacher un bouton dans l'interface ne sécurise rien : quelqu'un peut appeler directement l'URL de l'API. La vérification doit être faite côté serveur.
- Une Policy doit être vérifiée dans le contrôleur avant l'opération sensible
(par exemple avant
update()oudelete()), une fois l'utilisateur authentifié.
Codes HTTP à connaître
- 200 : requête réussie
- 201 : ressource créée
- 204 : suppression réussie sans contenu
- 404 : client inexistant
- 422 : données invalides
- 401 : utilisateur non authentifié
- 403 : utilisateur authentifié mais non autorisé