Projet de Synthèse : Marketplace de Produits Numériques avec Laravel 12
Construire une plateforme e-commerce multi-vendeurs complète
📚 10 séances • Dernière mise à jour : Décembre 2025
🎯 Objectif du Projet
Ce tutoriel vous guide pas à pas dans la création d'une marketplace de produits numériques multi-vendeurs complète avec Laravel 12. Vous apprendrez à implémenter les fonctionnalités exactes de notre application : l'authentification avec rôles, le système de boutiques vendeurs, le panier d'achat, les paiements Stripe et PayPal, la gestion des médias, et bien plus encore.
🛠️ Technologies Utilisées
Backend
- Laravel 12
- PHP 8.2+
- MySQL/MariaDB
- Eloquent ORM
Frontend
- Blade
- Bootstrap 5
- JavaScript ES6+
- Fetch API
Paiements
- Stripe PHP
Médias
- Spatie Media Library
Auth & Permissions
- Laravel Breeze
- Spatie Permission
Autres
- Spatie Translatable
- Spatie Activitylog
- Laravel Localization
📖 Plan du Cours
S1 Fondations & Catalogue Visiteur
S2 Authentification Breeze & Rôles
- → 2.1 Installation de Laravel Breeze
- → 2.1b Restauration Fichiers
- → 2.2 Activation Email (SMTP)
- → 2.3 Personnalisation Login
- → 2.4 Installation Spatie Permission
- → 2.4a Table Users (Champs Vendor)
- → 2.4b Config Middleware
- → 2.5 Modèle User & Traits
- → 2.6 Seeder des Rôles
- → 2.7 Redirection après Login
- → 2.8 Contrôleurs Dashboards
- → 2.9 Route Grouping
- → 2.10 Vues des Dashboards
S3 Multi-Vendeurs (Stores)
S4 Gestion Catégories (Admin)
S6 Panier (JS/Session)
S7 Commandes (Order & OrderItem)
S8 Paiements Stripe
S9 Dashboard Admin & Modération
S10 Finalisation
1.1 Introduction et Configuration
Bienvenue ! Nous allons construire une Marketplace complète. Nous allons suivre à la lettre l'architecture professionnelle de l'application finale.
⚠️ Prérequis
- PHP 8.2+, Composer, Node.js & NPM, MySQL.
1.2 Installation et Packages
étape 1 : Télécharger Laravel
étape 2 : Installer les dépendances (Traductions & UI)
⚠️ TRÈS IMPORTANT : Installez ces packages !
1. spatie/laravel-translatable : Indispensable pour éviter les erreurs `Unknown column 'name'`.
2. bootstrap : Pour le design professionnel que nous allons mettre en place via Vite.
étape 3 : Configurer Vite pour Bootstrap (Sans SCSS)
Nous allons charger Bootstrap via Vite en conservant app.css standard.
Dans resources/js/app.js, importez le CSS et le JS de Bootstrap :
Vérifiez que vite.config.js pointe bien vers app.css (par défaut) :
Et dans votre layout, appelez le CSS correctement :
étape 4 : Personnaliser le Style (app.css)
Pour un look plus moderne (Police Inter, ombres, boutons...), ajoutez ceci :
étape 5 : Configurer la BDD
Lancez le serveur de développement :
N'oubliez pas le lien de stockage :
1.3 Structure des Tables
Nous allons créer les tables users, stores, products et categories.
A. Table Stores (Boutiques)
Modifiez la migration create_stores_table.php :
B. Table Categories
C. Table Products
D. Table Pivot Product_Category
Pour lier les produits aux catégories.
Lancez les migrations maintenant :
1.4 Modèles (Configuration Spatie)
Modèle Product.php
Utilisez HasTranslations pour le nom et la description, et configurez l'accesseur pour les images (LoremFlickr).
Modèle Store.php
Modèle Category.php
1.5 Jeu de Données (Seeder)
Créez des données réalistes pour tester la navigation.
Action : php artisan migrate:fresh --seed
1.6 Routes
Ajoutez ces routes dans routes/web.php pour gérer l'accueil, les catégories et les produits.
1.7 Composants et Vues
Nous allons créer le layout et les vues pour la navigation.
A. Composant Product Card
Fichier: resources/views/components/product-card.blade.php
B. Composant Header
Fichier: resources/views/components/header.blade.php
C. Composant Navbar
Fichier: resources/views/components/main-navbar.blade.php
D. Composant Footer
Fichier: resources/views/components/footer.blade.php
E. Layout Principal
Fichier: resources/views/components/layouts/app.blade.php
F. Page d'Accueil (Welcome)
Fichier: resources/views/welcome.blade.php
G. Page Catégorie (Nouveau)
Fichier: resources/views/categories/show.blade.php
H. Fiche Produit (Nouveau)
Fichier: resources/views/products/show.blade.php
2.1 Installation de Laravel Breeze
Pour l'inscription et la connexion, nous utilisons Laravel Breeze.
étape 1 : Installer le package
Répondez "No" au support du Dark Mode et "PHPUnit" pour les tests.
Installez les dépendances front-end :
⚠️ IMPORTANT : Restauration des fichiers
L'installation de Breeze a écrasé web.php, app.js et app.css.
Nous devons remettre notre configuration Bootstrap et nos routes de la Séance 1.
1. Réparer resources/js/app.js
Gardez Alpine.js (pour Breeze) mais remettez Bootstrap :
2. Réparer resources/css/app.css
Remettez votre CSS personnalisé :
3. Réparer routes/web.php
Combinez les routes de la Séance 1 et celles de Breeze :
2.2 Activation du compte par Email
Configuration SMTP (Gmail)
Ajoutez ces variables dans votre fichier .env :
Implémenter MustVerifyEmail
Dans app/Models/User.php :
2.3 Personnalisation du Login (Remember Me)
Assurez-vous que la case "Se souvenir de moi" est présente dans resources/views/auth/login.blade.php :
2.4 Rôles et Permissions (Spatie)
Nous avons 3 types d'utilisateurs : Admin, Vendeur et Client.
2.4a Modification de la table Users
Nous devons ajouter le champ is_vendor et vendor_verified_at à la table users.
Dans la nouvelle migration créée (database/migrations/xxxx_xx_xx_xxxxxx_add_vendor_fields_to_users_table.php) :
ℹ️ Configuration des Middlewares
Pour utiliser role:admin dans vos routes, vous devez enregistrer les middlewares de Spatie.
Ouvrez bootstrap/app.php et ajoutez les alias dans withMiddleware :
2.5 Configuration du Modèle User
Ouvrez app/Models/User.php. Ajoutez le trait HasRoles.
2.6 Seeder des Rôles
Dans database/seeders/RolesAndPermissionsSeeder.php :
Dans database/seeders/DatabaseSeeder.php, appelez ce seeder en premier :
2.7 Redirection Intelligente
Nous voulons rediriger l'utilisateur vers son dashboard spécifique après le login.
Modifiez app/Http/Controllers/Auth/AuthenticatedSessionController.php, méthode store :
2.8 Création des Contrôleurs
Créez les contrôleurs pour chaque espace.
app/Http/Controllers/Admin/DashboardController.php :
app/Http/Controllers/Vendor/DashboardController.php :
2.9 Configuration des Routes
Ajoutez ces groupes de routes dans routes/web.php :
2.10 Vues des Dashboards
Créez les dossiers resources/views/admin et resources/views/vendor.
A. Dashboard Admin (admin/dashboard.blade.php)
B. Dashboard Vendeur (vendor/dashboard.blade.php)
C. Dashboard Client (dashboard.blade.php)
Laissez ou modifiez le fichier par défaut de Breeze pour afficher "Mes Commandes" et "Mes Téléchargements".
3.1 Tableau de Bord Vendeur & Gestion Boutique
Dans cette séance, nous permettons aux utilisateurs authentifiés de devenir vendeurs en créant leur propre boutique. Une fois la boutique créée, ils auront accès à leur tableau de bord vendeur.
Architecture : Nous séparons les routes "Vendeur" (/vendor/*) des routes "Client".
Un middleware vendor protégera l'accès.
3.2 Routes Vendeur & Middleware
étape 1 : Le Middleware Vendor
Vérifiez que l'utilisateur a le rôle 'vendor' ou 'admin'. Fichier : app/Http/Middleware/VendorMiddleware.php
Enregistrez le middleware (Laravel 11/12 : bootstrap/app.php)
étape 2 : Routes (routes/web.php)
Ajoutez ces routes pour gérer la création de boutique (pour devenir vendeur) et l'espace vendeur.
3.3a Mise à jour du Modèle Store
Assurez-vous que le champ description est bien présent dans la propriété $fillable de votre modèle app/Models/Store.php pour permettre sa modification.
3.3b Migration Commission Rate
Ajoutez le champ commission_rate à la table stores pour gérer les commissions.
Cochez le fichier de migration :
3.3 Logique : Vendor\StoreController
Copiez la méthode store() exacte pour la création de boutique.
Remarque : Notez l'utilisation de $user->assignRole('vendor') qui met à jour les permissions de l'utilisateur automatiquement.
3.4 La Vue de Création de Boutique
Créez le fichier resources/views/vendor/store/create.blade.php.
3.5b Mise à jour du Dashboard Vendeur
Modifiez resources/views/vendor/dashboard.blade.php pour afficher le nom de la boutique si elle existe, sinon le lien de création.
3.5b Mise à jour du Dashboard Vendeur
Modifiez app/Models/User.php pour ajouter la relation avec le modèle Store.
3.6 Testez votre travail
- Connectez-vous avec un compte utilisateur normal.
- Cliquez sur "Devenir Vendeur" ou allez sur
/become-vendor. - Remplissez le formulaire et validez.
- Vérifiez que vous êtes redirigé (vers le dashboard vendeur ou store.edit) et que vous avez maintenant le rôle 'vendor' en base de données.
4.1 Gestion des Catégories (Admin)
Pour organiser les produits, nous avons besoin de catégories. Seul l'Administrateur peut les gérer. Nous allons utiliser Spatie Media Library pour gérer les images (thumbnails) des catégories.
Rappel : Vous avez déjà installé spatie/laravel-medialibrary et spatie/laravel-translatable lors de la Séance 1.
Nous allons maintenant les utiliser concrètement.
4.1b Configuration de l'environnement (.env)
Pour que les images s'affichent correctement via Spatie Media Library, vous devez configurer l'URL de l'application dans votre fichier .env.
Cela permet de générer des URL absolues correctes pour les images uploadées.
4.2 Configuration du Modèle Category
Vérifiez votre fichier app/Models/Category.php. Il doit implémenter HasMedia et utiliser les traits nécessaires.
4.3 CategoryController (Admin)
Créez le contrôleur pour l'administration.
Voici le code complet pour gérer le CRUD et l'upload d'images :
4.4 Routes Admin
Ajoutez la route resource dans le groupe Admin de routes/web.php :
4.5 Vues Admin (Blade)
Créez le dossier resources/views/admin/categories.
A. Liste (index.blade.php)
B. Création (create.blade.php)
C. Édition (edit.blade.php)
Similaire à create, mais avec @method('PUT') et les valeurs pré-remplies.
✅ Vérification
- Connectez-vous en tant qu'Admin.
- Allez sur
/admin/categories. - Créez une catégorie "Logiciels" avec une image.
- Créez une sous-catégorie "Antivirus" (parent: Logiciels).
- Vérifiez que les images s'affichent bien dans la liste.
5.1 Configuration Multi-langues (Prérequis)
Avant de permettre aux vendeurs de créer des produits, nous devons gérer le multi-langue pour que les produits puissent avoir un nom et une description en Français, Anglais, etc.
1. Installation et Configuration
Ajoutez le middleware dans bootstrap/app.php :
1.b Configuration des Routes (web.php)
Pour que le préfixe de langue (ex: /en/admin/categories) fonctionne, vous devez envelopper toutes vos routes web dans le groupe LaravelLocalization.
2. Fichiers de Traduction
Créez la structure de dossiers pour les langues (ex: lang/fr, lang/en, lang/ar).
Exemple : lang/fr/messages.php
Exemple : lang/en/messages.php
Exemple : lang/ar/messages.php
3. Sélecteur de Langue (Navbar)
Ajoutez ce menu déroulant dans votre navigation (ex: resources/views/layouts/navigation.blade.php) :
4. Utilisation dans les Vues
Remplacez les textes en dur par la fonction __().
Dans le Dashboard Admin :
Dans le Dashboard Vendeur :
5.2 Modèle Product avec Spatie Media
Modifiez app/Models/Product.php pour gérer les collections d'images (Thumbnail, Galerie) et les fichiers numériques.
5.3 Routes Gestion Produits (Vendeur)
Ajoutez la resource products dans le groupe Vendeur de routes/web.php.
5.4 ProductController Vendeur
Implémentez les méthodes index, create et store en gérant les médias :
5.5 Vues : Liste & Formulaire
A. Liste des Produits (index.blade.php)
Créez resources/views/vendor/products/index.blade.php :
B. Formulaire de Création (create.blade.php)
Créez resources/views/vendor/products/create.blade.php :
6.1 Architecture du Panier
Pour le panier, nous allons utiliser une approche hybride moderne :
- Stockage Session (PHP) : Le panier est stocké côté serveur dans la session (sûr et persistant).
- Interface (JavaScript/AJAX) : Tout se passe sans rechargement de page.
- API Interne : Des routes spéciales en
routes/web.php(mais préfixéesapi/) servent le JSON.
6.2 API CartController (Session)
Ce contrôleur gère la session cart (panier). Copiez le code ci-dessous :
6.3 Routes API (routes/web.php)
Ajoutez ces routes dans routes/web.php. Elles doivent être dans le fichier web pour avoir accès à la session.
6.4 JavaScript (resources/js/cart.js)
Créez le fichier resources/js/cart.js. C'est le cœur de notre système AJAX.
IMPORTANT : Importez ce fichier dans resources/js/app.js
6.5 Vue Panier et Navigation
Créez resources/views/cart/index.blade.php (voir code du projet fourni pour le HTML complet).
Ajouter le lien "Panier" dans la Navigation
Dans resources/views/layouts/navigation.blade.php ou votre header, ajoutez l'icône :
Initialiser au chargement
Pour que le badge s'affiche dès l'arrivée sur le site, ajoutez ceci dans votre layout principal (app.blade.php), juste avant la fermeture du body :
Félicitations !
Vous avez terminé ce tutoriel complet de création d'une Marketplace avec Laravel 12.
📚 Ce que vous avez appris :
- ✅ Installation et configuration de Laravel 12
- ✅ Système d'authentification avec rôles
- ✅ Architecture multi-vendeurs (Marketplace)
- ✅ Gestion du panier avec JavaScript
- ✅ Intégration Stripe et PayPal
- ✅ Upload et gestion des médias (Spatie)
- ✅ Système de commandes complet
- ✅ Dashboard vendeur avec statistiques
- ✅ Administration de la plateforme
- ✅ Déploiement en production