Une API moderne pour gérer un blog avec REST et GraphQL, incluant des fonctionnalités avancées comme l'authentification, les relations entre modèles, les likes, et les commentaires imbriqués.
- Authentification : Inscription, connexion, déconnexion avec Sanctum.
- Gestion des articles : CRUD complet avec pagination, filtrage par statut, catégorie, ou tag.
- Gestion des catégories et tags : CRUD avec relations Many-to-Many.
- Commentaires : Ajout, suppression, et réponses imbriquées.
- Likes : Système de likes/dislikes pour les articles et commentaires.
- Soft Deletes : Suppression logique pour les articles, commentaires, catégories et tags.
- Pagination : Prise en charge native pour toutes les listes.
- Requêtes flexibles : Récupération des données avec des filtres avancés (statut, catégorie, recherche).
- Mutations : Création, modification, et suppression des articles, commentaires, catégories et tags.
- Relations : Chargement des relations (ex:
postsavec leurscomments,tags,category). - Pagination : Support natif pour les listes paginées.
- Sécurité : Protection des mutations avec des Policies et Sanctum.
| Technologie | Version | Usage |
|---|---|---|
| Laravel | 13 | Framework principal |
| Sanctum | - | Authentification API |
| Lighthouse | - | GraphQL |
| Eloquent | - | ORM pour les modèles |
| Soft Deletes | - | Suppression logique |
- PHP 8.1+
- Composer 2.5+
- Laravel 13
- Base de données (MySQL, PostgreSQL, SQLite, etc.)
git clone https://github.com/tu-projet/blog-api-laravel-13.git
cd blog-api-laravel-13composer installCopie le fichier .env.example et renomme-le en .env :
cp .env.example .envGénère une clé d'application :
php artisan key:generateModifie le fichier .env pour configurer ta base de données :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=blog_api
DB_USERNAME=root
DB_PASSWORD=php artisan migratecomposer require nuwave/lighthouse
php artisan lighthouse:installphp artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider"app/
├── Enums/
│ └── PostStatus.php # Statuts des articles (DRAFT, PUBLISHED, ARCHIVED)
├── Http/
│ ├── Controllers/
│ │ ├── AuthController.php
│ │ ├── CategoryController.php
│ │ ├── CommentController.php
│ │ ├── CommentLikeController.php
│ │ ├── PostController.php
│ │ ├── PostLikeController.php
│ │ └── TagController.php
│ └── Requests/
│ ├── StoreCommentRequest.php
│ ├── StorePostRequest.php
│ └── UpdatePostRequest.php
├── Models/
│ ├── Category.php
│ ├── Comment.php
│ ├── Like.php
│ ├── Post.php
│ ├── Tag.php
│ └── User.php
├── Policies/
│ ├── CommentPolicy.php
│ └── PostPolicy.php
└── graphql/
└── schema.graphql # Schéma GraphQL
routes/
└── api.php # Routes API REST
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/register |
Inscription d'un utilisateur |
POST |
/login |
Connexion d'un utilisateur |
POST |
/logout |
Déconnexion (nécessite un token valide) |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/posts |
Liste des articles publiés (paginés) |
GET |
/posts/{post} |
Détails d'un article |
POST |
/posts |
Créer un article (authentification requise) |
PUT |
/posts/{post} |
Modifier un article (authentification requise) |
DELETE |
/posts/{post} |
Supprimer un article (authentification requise) |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/categories |
Liste des catégories |
GET |
/categories/{category} |
Détails d'une catégorie |
POST |
/categories |
Créer une catégorie (authentification requise) |
PUT |
/categories/{category} |
Modifier une catégorie (authentification requise) |
DELETE |
/categories/{category} |
Supprimer une catégorie (authentification requise) |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/tags |
Liste des tags |
GET |
/tags/{tag} |
Détails d'un tag |
POST |
/tags |
Créer un tag (authentification requise) |
PUT |
/tags/{tag} |
Modifier un tag (authentification requise) |
DELETE |
/tags/{tag} |
Supprimer un tag (authentification requise) |
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/posts/{post}/comments |
Ajouter un commentaire (authentification requise) |
DELETE |
/comments/{comment} |
Supprimer un commentaire (authentification requise) |
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/posts/{post}/like |
Ajouter/supprimer un like sur un article (authentification requise) |
POST |
/comments/{comment}/like |
Ajouter/supprimer un like sur un commentaire (authentification requise) |
- User : Utilisateur avec ses articles, commentaires et likes.
- Post : Article avec son auteur, catégorie, tags, commentaires et likes.
- Category : Catégorie avec ses articles.
- Tag : Tag avec ses articles.
- Comment : Commentaire avec son auteur, article parent, et réponses.
# Récupérer tous les articles publiés
query {
posts(status: PUBLISHED) {
data {
id
title
content
status
user {
id
name
}
category {
id
name
}
tags {
id
name
}
comments {
data {
id
content
user {
id
name
}
}
}
}
paginatorInfo {
total
currentPage
lastPage
}
}
}
# Récupérer un article spécifique
query {
post(id: 1) {
id
title
content
user {
name
}
comments {
data {
id
content
user {
name
}
}
}
}
}
# Récupérer le profil de l'utilisateur connecté
query {
me {
id
name
email
posts {
data {
id
title
}
}
}
}# Créer un article
mutation {
createPost(
title: "Mon premier article"
content: "Contenu de mon article..."
category_id: 1
status: PUBLISHED
tags: [1, 2]
) {
id
title
status
}
}
# Modifier un article
mutation {
updatePost(
id: 1
title: "Titre mis à jour"
content: "Contenu mis à jour..."
) {
id
title
content
}
}
# Supprimer un article
mutation {
deletePost(id: 1) {
id
}
}
# Ajouter un commentaire
mutation {
createComment(
post_id: 1
content: "Super article !"
) {
id
content
}
}
# Ajouter un like à un article
mutation {
likePost(id: 1) {
id
}
}- Inscription :
POST /registeravecname,email,password, etpassword_confirmation. - Connexion :
POST /loginavecemailetpassword. Retourne un token à utiliser pour les requêtes protégées. - Déconnexion :
POST /logout(nécessite un token valide).
Pour les requêtes protégées, ajoute le token dans l'en-tête Authorization :
Authorization: Bearer {ton_token}curl -X POST \
http://ton-domaine.test/api/posts \
-H 'Authorization: Bearer {ton_token}' \
-H 'Content-Type: application/json' \
-d '{
"title": "Mon premier article",
"content": "Contenu de mon article...",
"category_id": 1,
"status": "published",
"tags": [1, 2]
}'query {
post(id: 1) {
id
title
content
user {
name
}
category {
name
}
tags {
name
}
comments {
data {
content
user {
name
}
}
}
}
}curl -X POST \
http://ton-domaine.test/api/posts/1/comments \
-H 'Authorization: Bearer {ton_token}' \
-H 'Content-Type: application/json' \
-d '{
"content": "Super article !",
"parent_id": null
}'- Policies : Les actions de modification/suppression sont protégées par des Policies (ex: seul l'auteur peut modifier/supprimer son article).
- Sanctum : Toutes les routes protégées nécessitent un token valide.
- Validation : Toutes les requêtes sont validées (ex:
StorePostRequest,UpdatePostRequest). - Soft Deletes : Les modèles utilisent
SoftDeletespour éviter la suppression définitive.
Le statut des articles est géré par un Enum (PostStatus). Tu peux le modifier dans app/Enums/PostStatus.php :
enum PostStatus: string
{
case DRAFT = 'draft';
case PUBLISHED = 'published';
case ARCHIVED = 'archived';
}Pour ajouter des champs (ex: image pour les articles), modifie les migrations et les modèles :
// Dans la migration
$table->string('image')->nullable();
// Dans le modèle Post
protected $fillable = ['title', 'slug', 'content', 'status', 'user_id', 'category_id', 'image'];Modifie le fichier graphql/schema.graphql pour ajouter des champs ou des mutations personnalisées.
- Pagination : Toutes les listes sont paginées par défaut (10 éléments par page).
- Relations : Les modèles utilisent Eloquent pour gérer les relations (ex:
hasMany,belongsTo,belongsToMany). - Soft Deletes : Les modèles supprimés sont conservés en base de données (utilise
deleted_atpour les filtrer). - Lighthouse : Le schéma GraphQL est défini dans
graphql/schema.graphql.
- Cache : Utiliser Redis pour cache les requêtes fréquentes (ex: liste des articles).
- Recherche avancée : Intégrer Scout ou Algolia pour une recherche full-text.
- Notifications : Ajouter des notifications pour les nouveaux commentaires ou likes.
- Rate Limiting : Limiter le nombre de requêtes par utilisateur.
- Webhooks : Notifier des services externes lors de la création/modification d'articles.
- Tests : Ajouter des tests unitaires et d'intégration pour couvrir toutes les fonctionnalités.