🏊🏊♂️🏊♀️
NS’App v1.0
🐯🐯 Routes de l'API
Poisson Rouges « Notes Cours » — ## les routes et les contrôleurs structurent les requêtes HTTP et organisent la logique de l’ application ## VOIR LA DOC Routes Voir La DOC Controleurs
Dans routes/api.php :
Lien : — How to Use Route Groups and Prefixes in Laravel 11
Vérifier les routes « get post delete »
php artisan route:list
🐯🐯 Routes api.php
Routes/api.php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\RoleController;
use App\Http\Controllers\UserController;
use App\Http\Controllers\UploadController;
use App\Http\Controllers\PageController;
use App\Http\Controllers\ExerciseController;
use App\Http\Controllers\PlanController;
use App\Http\Controllers\WorkoutController;
use App\Http\Controllers\MylisteController;
use App\Http\Controllers\SwimSetController;
use App\Http\Controllers\WorkoutExerciseController;
use App\Http\Controllers\WorkoutSwimSetController;
use App\Http\Controllers\PlanWorkoutController;
use App\Http\Controllers\MylisteItemController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
| Ici sont enregistrées les routes API de l'app Ces routes sont
*/
// ************************************************************************
// Routes pour les rôles (Roles)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les rôles
Route::apiResource('roles', RoleController::class);
// Route pour récupérer les utilisateurs associés à un rôle spécifique
Route::get('roles/{role}/users', [UserController::class, 'getUsersByRole']);
// ************************************************************************
// Routes pour les utilisateurs (Users)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les utilisateurs
Route::apiResource('users', UserController::class);
// ************************************************************************
// Routes pour les fichiers uploadés (Uploads)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les fichiers uploadés
Route::apiResource('uploads', UploadController::class);
// Route pour récupérer les fichiers uploadés par un utilisateur spécifique
Route::get('users/{user}/uploads', [UploadController::class, 'getUserUploads']);
// ************************************************************************
// Routes pour les pages (Pages)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les pages
Route::apiResource('pages', PageController::class);
// ************************************************************************
// Routes pour les exercices (Exercises)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les exercices
Route::apiResource('exercises', ExerciseController::class);
// ************************************************************************
// Routes pour les plans (Plans)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les plans
Route::apiResource('plans', PlanController::class);
// Route pour récupérer les séances d'entraînement (workouts) associées à un plan spécifique
Route::get('plans/{plan}/workouts', [PlanWorkoutController::class, 'index']);
// Route pour ajouter une séance d'entraînement à un plan
Route::post('plans/{plan}/workouts/{workout}', [PlanWorkoutController::class, 'store']);
// Route pour supprimer une séance d'entraînement d'un plan
Route::delete('plans/{plan}/workouts/{workout}', [PlanWorkoutController::class, 'destroy']);
// ************************************************************************
// Routes pour les séances d'entraînement (Workouts)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les séances d'entraînement
Route::apiResource('workouts', WorkoutController::class);
// Route pour récupérer les exercices associés à une séance d'entraînement spécifique
Route::get('workouts/{workout}/exercises', [WorkoutExerciseController::class, 'index']);
// Route pour ajouter un exercice à une séance d'entraînement
Route::post('workouts/{workout}/exercises/{exercise}', [WorkoutExerciseController::class, 'store']);
// Route pour supprimer un exercice d'une séance d'entraînement
Route::delete('workouts/{workout}/exercises/{exercise}', [WorkoutExerciseController::class, 'destroy']);
// Route pour récupérer les séries de natation (swim sets) associées à une séance d'entraînement spécifique
Route::get('workouts/{workout}/swim-sets', [WorkoutSwimSetController::class, 'index']);
// Route pour ajouter une série de natation à une séance d'entraînement
Route::post('workouts/{workout}/swim-sets/{swimSet}', [WorkoutSwimSetController::class, 'store']);
// Route pour supprimer une série de natation d'une séance d'entraînement
Route::delete('workouts/{workout}/swim-sets/{swimSet}', [WorkoutSwimSetController::class, 'destroy']);
// ************************************************************************
// Routes pour les séries de natation (Swim Sets)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les séries de natation
Route::apiResource('swim-sets', SwimSetController::class);
// ************************************************************************
// Routes pour les listes personnelles (Mylistes)
// ************************************************************************
// Route de ressource pour les opérations CRUD de base sur les listes personnelles
Route::apiResource('mylistes', MylisteController::class);
// Route pour récupérer les éléments (exercices, séances, plans) associés à une liste personnelle spécifique
Route::get('myliste/{myliste}/items', [MylisteItemController::class, 'index']);
// Route pour ajouter un élément à une liste personnelle
Route::post('myliste/{myliste}/items', [MylisteItemController::class, 'store']);
// Route pour supprimer un élément d'une liste personnelle
Route::delete('myliste/{myliste}/items/{item}', [MylisteItemController::class, 'destroy']);
🐍🐍 Routes api.php ## Authentification
// Ajout Authentification
// Routes de ressources
Route::apiResource('users', UserController::class); // Génère plusieurs routes (GET, POST, PUT, DELETE)
// Routes individuelles
Route::post('/login', [AuthController::class, 'login']);
Route::get('/profile', [UserController::class, 'profile']);
🐍🐍 Tests de l'API Laravel 11 avec Postman
Les liens (endpoints) sont générés. Ils correspondent aux routes définies dans le fichier
routes/api.php
.
Nous utilisons les méthodes HTTP appropriées (GET, POST, PUT, DELETE) pour chaque route.
Le serveur Laravel est en cours d’exécution
URL de base correcte : http://localhost:8000/api
Rôles (Roles)
- Récupérer tous les rôles : http://localhost:8000/api/roles (GET)
- Récupérer un rôle spécifique : http://localhost:8000/api/roles/{id} (GET)
- Créer un rôle : http://localhost:8000/api/roles (POST)
- Mettre à jour un rôle : http://localhost:8000/api/roles/{id} (PUT/PATCH)
- Supprimer un rôle : http://localhost:8000/api/roles/{id} (DELETE)
- Récupérer les utilisateurs d’un rôle : http://localhost:8000/api/roles/{id}/users (GET)
Utilisateurs (Users)
-
Récupérer tous les utilisateurs : http://localhost:8000/api/users (GET)
-
Récupérer un utilisateur spécifique : http://localhost:8000/api/users/{id} (GET)
-
Créer un utilisateur : http://localhost:8000/api/users (POST)
-
Mettre à jour un utilisateur : http://localhost:8000/api/users/{id} (PUT/PATCH)
-
Supprimer un utilisateur : http://localhost:8000/api/users/{id} (DELETE)
Fichiers Uploadés (Uploads)
-
Récupérer tous les fichiers uploadés : http://localhost:8000/api/uploads (GET)
-
Récupérer un fichier uploadé spécifique : http://localhost:8000/api/uploads/{id} (GET)
-
Créer un fichier uploadé : http://localhost:8000/api/uploads (POST)
-
Mettre à jour un fichier uploadé : http://localhost:8000/api/uploads/{id} (PUT/PATCH)
-
Supprimer un fichier uploadé : http://localhost:8000/api/uploads/{id} (DELETE)
-
Récupérer les fichiers uploadés d’un utilisateur : http://localhost:8000/api/users/{id}/uploads (GET)
Pages (Pages)
-
Récupérer toutes les pages : http://localhost:8000/api/pages (GET)
-
Récupérer une page spécifique : http://localhost:8000/api/pages/{id} (GET)
-
Créer une page : http://localhost:8000/api/pages (POST)
-
Mettre à jour une page : http://localhost:8000/api/pages/{id} (PUT/PATCH)
-
Supprimer une page : http://localhost:8000/api/pages/{id} (DELETE)
Exercices (Exercises)
-
Récupérer tous les exercices : http://localhost:8000/api/exercises (GET)
-
Récupérer un exercice spécifique : http://localhost:8000/api/exercises/{id} (GET)
-
Créer un exercice : http://localhost:8000/api/exercises (POST)
-
Mettre à jour un exercice : http://localhost:8000/api/exercises/{id} (PUT/PATCH)
-
Supprimer un exercice : http://localhost:8000/api/exercises/{id} (DELETE)
Plans (Plans)
-
Récupérer tous les plans : http://localhost:8000/api/plans (GET)
-
Récupérer un plan spécifique : http://localhost:8000/api/plans/{id} (GET)
-
Créer un plan : http://localhost:8000/api/plans (POST)
-
Mettre à jour un plan : http://localhost:8000/api/plans/{id} (PUT/PATCH)
-
Supprimer un plan : http://localhost:8000/api/plans/{id} (DELETE)
-
Récupérer les séances d’entraînement d’un plan : http://localhost:8000/api/plans/{id}/workouts (GET)
-
Ajouter une séance d’entraînement à un plan : http://localhost:8000/api/plans/{id}/workouts/{workoutId} (POST)
-
Supprimer une séance d’entraînement d’un plan : http://localhost:8000/api/plans/{id}/workouts/{workoutId} (DELETE)
Séances d’entraînement (Workouts)
-
Récupérer toutes les séances d’entraînement : http://localhost:8000/api/workouts (GET)
-
Récupérer une séance d’entraînement spécifique : http://localhost:8000/api/workouts/{id} (GET)
-
Créer une séance d’entraînement : http://localhost:8000/api/workouts (POST)
-
Mettre à jour une séance d’entraînement : http://localhost:8000/api/workouts/{id} (PUT/PATCH)
-
Supprimer une séance d’entraînement : http://localhost:8000/api/workouts/{id} (DELETE)
-
Récupérer les exercices d’une séance d’entraînement : http://localhost:8000/api/workouts/{id}/exercises (GET)
-
Ajouter un exercice à une séance d’entraînement : http://localhost:8000/api/workouts/{id}/exercises/{exerciseId} (POST)
-
Supprimer un exercice d’une séance d’entraînement : http://localhost:8000/api/workouts/{id}/exercises/{exerciseId} (DELETE)
-
Récupérer les séries de natation d’une séance d’entraînement : http://localhost:8000/api/workouts/{id}/swim-sets (GET)
-
Ajouter une série de natation à une séance d’entraînement : http://localhost:8000/api/workouts/{id}/swim-sets/{swimSetId} (POST)
-
Supprimer une série de natation d’une séance d’entraînement : http://localhost:8000/api/workouts/{id}/swim-sets/{swimSetId} (DELETE)
Séries de natation (Swim Sets)
-
Récupérer toutes les séries de natation : http://localhost:8000/api/swim-sets (GET)
-
Récupérer une série de natation spécifique : http://localhost:8000/api/swim-sets/{id} (GET)
-
Créer une série de natation : http://localhost:8000/api/swim-sets (POST)
-
Mettre à jour une série de natation : http://localhost:8000/api/swim-sets/{id} (PUT/PATCH)
-
Supprimer une série de natation : http://localhost:8000/api/swim-sets/{id} (DELETE)
Listes personnelles (Mylists)
-
Récupérer toutes les listes personnelles : http://localhost:8000/api/mylists (GET)
-
Récupérer une liste personnelle spécifique : http://localhost:8000/api/mylists/{id} (GET)
-
Créer une liste personnelle : http://localhost:8000/api/mylists (POST)
-
Mettre à jour une liste personnelle : http://localhost:8000/api/mylists/{id} (PUT/PATCH)
-
Supprimer une liste personnelle : http://localhost:8000/api/mylists/{id} (DELETE)
-
Récupérer les éléments d’une liste personnelle : http://localhost:8000/api/mylist/{id}/items (GET)
-
Ajouter un élément à une liste personnelle : http://localhost:8000/api/mylist/{id}/items (POST)
-
Supprimer un élément d’une liste personnelle : http://localhost:8000/api/mylist/{id}/items/{itemId} (DELETE)
🦊🦊 Astuce - Scripts Routes Postman
📌 Générer la liste des routes en JSON
🛠 Exécutez la commande pour générer le JSON contenant toutes vos routes :
php artisan route:list --json > routes.json
🛠 Ce fichier routes.json contiendra la liste complète des routes avec leurs méthodes HTTP, URI et autres
🔧 Créer le script d’export
Créez un nouveau fichier, par exemple export-postman.php, à la racine (ou dans un dossier dédié, par exemple scripts/) — à suprm avant production :
// il y qlq chose à ajouter ici :-)
// export-postman.php
// Définir l'URL de base sans slash final
$baseUrl = rtrim("http://localhost:8000", '/');
// Chemin du fichier de routes généré par Laravel
$routesFile = __DIR__ . '/routes.json';
if (!file_exists($routesFile)) {
die("Le fichier routes.json n'existe pas. Veuillez d'abord générer la liste des routes avec 'php artisan route:list --json > routes.json'.\n");
}
// Lire et décoder le fichier JSON contenant les routes
$routesData = json_decode(file_get_contents($routesFile), true);
if (!$routesData) {
die("Erreur lors de la lecture ou du décodage de routes.json.\n");
}
// Initialiser la structure de la collection Postman
$postmanCollection = [
"info" => [
"_postman_id" => uniqid(),
"name" => "APP_NS_V1",
"schema" => "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
],
"item" => []
];
// Regrouper les routes par le premier segment d'URI (exemple : "users", "roles", etc.)
$groupedRoutes = [];
foreach ($routesData as $route) {
// Récupérer l'URI et retirer le slash initial s'il existe
$uri = ltrim($route['uri'] ?? '', '/');
// On ne traite que les routes commençant par "api"
if (strpos($uri, 'api') !== 0) {
continue;
}
// Pour le regroupement, supprimer le préfixe "api/" s'il est présent
$uriForGrouping = $uri;
if (strpos($uri, 'api/') === 0) {
$uriForGrouping = substr($uri, strlen('api/'));
}
$segments = explode('/', trim($uriForGrouping, '/'));
$group = $segments[0] ?? 'Autres';
// Construire l'URL complète sans double slash
$requestUrl = $baseUrl . '/' . $uri;
// Créer la structure de la requête Postman
$request = [
"method" => strtoupper($route['method'] ?? 'GET'),
"header" => [],
"url" => [
"raw" => $requestUrl,
"protocol" => "http",
"host" => ["localhost"],
"port" => "8000",
"path" => explode('/', $uri)
]
];
$item = [
"name" => $uri,
"request" => $request,
"response"=> []
];
// Ajouter la requête dans le groupe correspondant
$groupedRoutes[$group][] = $item;
}
// Construire les items de la collection en regroupant par section
foreach ($groupedRoutes as $groupName => $items) {
$postmanCollection["item"][] = [
"name" => ucfirst($groupName),
"item" => $items
];
}
// Exporter la collection au format JSON dans un fichier
$outputFile = __DIR__ . '/postman_collection.json';
file_put_contents($outputFile, json_encode($postmanCollection, JSON_PRETTY_PRINT));
echo "La collection Postman a été générée avec succès dans le fichier : $outputFile\n";
📌 Exécuter le script
php export-postman.php
🌱 Importer dans Postman
mon Postman +++ Import +++ sélection fichier postman_collection.json +++ Importer === Affichage par dossier ===
🚀 Master API Testing with Postman! Beginner to Pro in One Course!
🌱 Visualiser et Mettre à jour les Collections
📌 ==>> React Front ===>> Axios configuration ==>> CRUD des données via Formulaires
🐠🐠🐠🐠🐠 Méthodes HTTP avec Postman
GET
== Récupérer une ressource depuis le serveur.
POST
== Envoyer des données au serveur pour créer une nouvelle ressource ou déclencher une action.
PUT
== Mettre à jour ou remplacer complètement une ressource existante.
== PATCH
Effectuer une mise à jour partielle d’une ressource (modifier uniquement certains champs).
DELETE
== Supprimer une ressource du serveur.
HEAD
== Récupérer uniquement les en-têtes d’une ressource, sans son corps.
OPTIONS
== Demander au serveur les méthodes HTTP supportées pour une ressource donnée.
🦊🦊 Vérification Tables BDD
Version MySQL: 8.0.40 version récente stable
Encodage utf8mb4_unicode_ci pour la gestion des caractères internationaux.
Moteurs de Stockage InnoDB
Tables Principales et Relations
users
Contient username, first_name, last_name, old_name, email, password, role_id.
role_id est une clé étrangère vers roles.
La colonne old_name est présente un renommage de colonne est effectué
roles
Contient name.
Utilisé pour gérer les rôles des utilisateurs.
exercises
Contient title, description, exercise_level, exercise_category, upload_id, user_id.
upload_id est une clé étrangère vers uploads.
user_id est une clé étrangère vers users.
pages
Contient title, content, page_category, upload_id, user_id.
upload_id est une clé étrangère vers uploads.
user_id est une clé étrangère vers users.
plans
Contient title, description, plan_category, user_id.
user_id est une clé étrangère vers users.
workouts
Contient title, description, workout_category, user_id.
user_id est une clé étrangère vers users.
swim_sets:
Contient workout_id, exercise_id, set_distance, set_repetition, rest_time.
workout_id est une clé étrangère vers workouts.
exercise_id est une clé étrangère vers exercises.
mylist
Contient user_id, title, description.
user_id est une clé étrangère vers users.
mylist_items
Contient mylist_id, item_id, item_type.
mylist_id est une clé étrangère vers mylist.
Tables de jointure (relations Many-to-Many):
workout_exercises
workout_swim_sets
plan_workouts
Tables Automatiques Laravel migration
cache, cache_locks: Utilisées pour la mise en cache
failed_jobs, jobs, job_batches: Utilisées pour la gestion des tâches en file d’attente
migrations: Utilisée pour suivre les migrations de base de données
password_reset_tokens: Utilisée pour la réinitialisation des mots de passe
personal_access_tokens: Utilisée pour les tokens d’accès personnels (Sanctum)
sessions: Utilisée pour la gestion des sessions
uploads: Utilisée pour stocker les informations sur les fichiers téléchargés.
Clés Étrangères: Toutes les clés étrangères sont correctement définies avec les options ON DELETE CASCADE ou ON DELETE SET NULL
La présence de old_name dans la table users ==>> un renommage de colonne
migrations bien organisées comme le montre la table migrations
old_name a supprimer de la table users pour nettoyer la base de données
Comment effectuez des tests pour s assurer que toutes les relations et les contraintes fonctionnent
comment Mettez en place des sauvegardes régulières de votre base de données pour éviter la perte de données.
En résumé, votre schéma de base de données est bien conçu et suit les bonnes pratiques. Assurez-vous simplement de gérer la colonne old_name et de maintenir des sauvegardes régulières.
🙈🙉🙊 Generation des données
Créer le seeder +++ Mettre à jour à partir des Md & Ctrlr +++ Exécuter une par une dans l’ordre
$this->call([
// 01 - RoleSeeder::class,
// 02 - UserSeeder::class,
// 03 - UploadSeeder::class,
// 04 - ExerciseSeeder::class,
// 05 - PageSeeder::class,
// 06 - PlanSeeder::class,
// 07 - WorkoutSeeder::class,
// 08 - SwimSetSeeder::class,
// 09 - MylistSeeder::class,
// 10 - MylistItemSeeder::class,
]);
Dans l’ordre : – Les derniers seeders vont récupérer les données des premiers
Verification : PhpMyAdmin : ==>> Go
Verification : Postman : ==>> Go » Requêtes »
🐫🐫 Seeder Role
seeder pour la table roles avec les rôles « admin », « user », « athlet », et « coach »
génèrer
php artisan make:seeder RoleSeeder
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\Role;
class RoleSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
Role::create(['name' => 'admin']);
Role::create(['name' => 'user']);
Role::create(['name' => 'athlet']);
Role::create(['name' => 'coach']);
}
}
Dans DatabaseSeeder.php mettre à jour l’execution
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
// \App\Models\User::factory(10)->create();
// \App\Models\User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
$this->call([
RoleSeeder::class,
]);
}
}
Exécuter le seeder
php artisan db:seed
Voir DB +++=== supprimer refaire erreur
php artisan migrate:fresh --seed
🐫🐫 Seeder Users
seeder pour utilisateurs
génèrer
php artisan make:seeder UserSeeder
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Role; // Importez le modèle Role
use Illuminate\Support\Facades\Hash;
class UserSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
// Récupérer les rôles par leur nom
$adminRole = Role::where('name', 'admin')->first();
$userRole = Role::where('name', 'user')->first();
$athletRole = Role::where('name', 'athlet')->first();
$coachRole = Role::where('name', 'coach')->first();
// Créer les utilisateurs
User::create([
'username' => 'admin',
'email' => 'admin@admin.net',
'password' => Hash::make('admin123'),
'first_name' => 'Hassan',
'last_name' => 'ELHAOUAT',
'role_id' => $adminRole->id,
]);
User::create([
'username' => 'user1',
'email' => 'user@user.net',
'password' => Hash::make('user123'),
'first_name' => 'Hassan1',
'last_name' => 'ELHAOUAT2',
'role_id' => $userRole->id,
]);
User::create([
'username' => 'athlet1',
'email' => 'athlet@athlet.net',
'password' => Hash::make('athlet123'),
'first_name' => 'athlet',
'last_name' => 'sportif',
'role_id' => $athletRole->id,
]);
User::create([
'username' => 'coach1',
'email' => 'coach@coach.net',
'password' => Hash::make('coach123'),
'first_name' => 'coach',
'last_name' => 'entraineur',
'role_id' => $coachRole->id,
]);
}
}
Dans DatabaseSeeder.php mettre à jour l’execution
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([
RoleSeeder::class, // Assurez-vous que RoleSeeder est exécuté en premier
UserSeeder::class,
]);
}
}
Exécuter le seeder
php artisan db:seed
Voir DB +++=== supprimer refaire erreur
php artisan migrate:fresh --seed
– Visualisation structure du projet :
- # brew install tree // Installation sous mac
- # tree -a > project_structure.txt // generation globale
- # find . -maxdepth 2 > project_structure.txt // Pour limiter la profondeur