Retour au portfolio

Compte Rendu - SIO Shoes

Application e-commerce Symfony complète

📋 Informations générales

Nom du projet : SIO Shoes - Application E-commerce Symfony
Date de création : Projet BTS SIO SLAM
Auteur : Abdelmalek Elidrissi
Type : Application e-commerce complète

🎯 Objectifs du projet

🛠️ Technologies utilisées

Backend

PHP 8.2+ Symfony 7.3 Doctrine ORM 3.5 Doctrine DBAL 3 PostgreSQL Stripe PHP SDK 18.0 Dompdf 3.1 Symfony Mailer 7.3 Symfony Security 7.3 Symfony Forms 7.3 KnpPaginatorBundle 6.9

Frontend

Twig 2.12/3.0 Bootstrap JavaScript ES6+ Stimulus 2.30 Turbo 2.31 Asset Mapper 7.3

Infrastructure & Outils

Docker & Docker Compose Composer Symfony CLI Git PHPUnit 11.5

📁 Structure du projet

Site_eShoes-main/ ├── config/ # Configuration Symfony │ ├── packages/ # Configuration des bundles │ ├── routes/ # Routes de l'application │ └── services.yaml # Configuration des services ├── public/ # Point d'entrée web │ └── index.php # Front controller ├── src/ │ ├── Controller/ # 12 contrôleurs (Bill, Cart, Category, etc.) │ ├── Entity/ # 8 entités Doctrine │ ├── Form/ # 7 formulaires Symfony │ ├── Repository/ # Repositories Doctrine │ ├── Service/ # Services métier (StripePayment) │ └── Twig/ # Extensions Twig ├── templates/ # Templates Twig (~50 templates) ├── migrations/ # 15 migrations de base de données ├── assets/ # Assets frontend (JS/CSS) ├── tests/ # Tests unitaires └── docker/ # Configuration Docker

🔧 Fonctionnalités implémentées

1. Gestion des produits (ProductController)

CRUD Produits

Gestion du stock

Catégories et sous-catégories

2. Panier d'achat (CartController)

3. Système de commandes (OrderController)

Processus de commande

Entités

4. Paiement Stripe (StripeController)

5. Authentification et sécurité

Inscription et connexion

Sécurité Symfony

6. Administration

7. Génération de factures PDF (BillController)

8. Envoi d'emails (Symfony Mailer)

9. Gestion des villes (CityController)

10. Page d'accueil et catalogue (HomeController)

📊 Modèle de données

Entités principales

Entité Propriétés principales Relations
User id, email, password, roles orders (OneToMany)
Product id, name, description, price, stock, image category (ManyToOne), subCategory (ManyToOne), addProductHistories (OneToMany)
Category id, name products (OneToMany), subCategories (OneToMany)
SubCategory id, name category (ManyToOne), products (OneToMany)
Order id, total, status, createdAt user (ManyToOne), orderProducts (OneToMany), city (ManyToOne)
OrderProducts id, quantity, price order (ManyToOne), product (ManyToOne)
AddProductHistory id, quantity, addedAt product (ManyToOne)
City id, name orders (OneToMany)

🌐 Routes principales

Routes publiques

Route Méthode Description
/ GET Page d'accueil avec catalogue de produits
/product/{id} GET Détails d'un produit
/register GET, POST Inscription
/login GET, POST Connexion
/cart GET Panier d'achat

Routes authentifiées

Route Méthode Description
/cart/add/{id} POST Ajouter au panier
/cart/remove/{id} POST Retirer du panier
/order GET, POST Passer une commande
/orders GET Historique des commandes
/order/{id}/bill GET Facture d'une commande (PDF)

Routes Stripe

Route Méthode Description
/stripe/checkout GET, POST Page de paiement Stripe
/stripe/success GET Succès du paiement
/stripe/cancel GET Annulation du paiement

Routes administrateur

Route Méthode Description
/admin/products GET Liste des produits (admin)
/admin/products/new GET, POST Créer un produit
/admin/products/{id}/edit GET, POST Modifier un produit
/admin/categories GET Gestion des catégories
/admin/users GET Gestion des utilisateurs

🚀 Installation et démarrage

Prérequis

Étapes d'installation

  1. Installer les dépendances PHP
    cd Projets/Site_eShoes-main composer install
  2. Configurer les variables d'environnement

    Créer `.env.local` :

    DATABASE_URL="postgresql://app:!ChangeMe!@127.0.0.1:5432/app?serverVersion=16&charset=utf8" STRIPE_PUBLIC_KEY="votre_clé_publique_stripe" STRIPE_SECRET_KEY="votre_clé_secrète_stripe" MAILER_DSN="smtp://localhost:1025"
  3. Démarrer la base de données
    docker compose up -d
  4. Créer la base de données et exécuter les migrations
    php bin/console doctrine:database:create php bin/console doctrine:migrations:migrate
  5. Installer les assets frontend
    npm install npm run build
  6. Lancer l'application
    symfony server:start # Ou avec PHP natif php -S localhost:8000 -t public

💡 Points techniques remarquables

Architecture MVC

  • Séparation Modèle-Vue-Contrôleur
  • Design Pattern Repository
  • Services dédiés (StripePayment)
  • Formulaires Symfony

Sécurité

  • Protection CSRF automatique
  • Chiffrement bcrypt
  • Contrôle d'accès par rôle
  • Sessions sécurisées

Base de données

  • 15 migrations versionnées
  • Doctrine ORM avec annotations
  • Relations OneToMany/ManyToOne
  • Requêtes optimisées

Performance

  • Pagination KnpPaginatorBundle
  • Cache Symfony
  • Turbo pour navigation
  • Asset Mapper

🐛 Difficultés rencontrées et solutions

Problème 1 : Gestion des relations Doctrine

Création correcte des relations entre entités (OneToMany, ManyToOne).

Solution : Étude approfondie de la documentation Doctrine et création correcte des annotations de relations avec les propriétés `inversedBy` et `mappedBy`.
Problème 2 : Intégration Stripe

Configuration et utilisation correcte du SDK Stripe PHP.

Solution : Utilisation du SDK Stripe PHP officiel (version 18.0), configuration correcte des clés API de test dans `.env.local`, et création d'un service dédié pour encapsuler la logique de paiement.
Problème 3 : Génération de PDF

Génération de factures PDF avec Dompdf.

Solution : Utilisation de Dompdf (version 3.1) avec création de templates HTML dédiés pour les factures, puis conversion en PDF.
Problème 4 : Gestion du panier en session

Sauvegarde du panier en session et persistance entre les requêtes.

Solution : Utilisation de la session Symfony pour stocker temporairement les articles du panier avec gestion des quantités et des totaux.
Problème 5 : Pagination des produits

Implémentation de la pagination sur la liste des produits.

Solution : Utilisation de KnpPaginatorBundle qui permet une pagination simple et efficace avec configuration dans le contrôleur.
Problème 6 : Upload d'images

Upload et stockage des images de produits.

Solution : Utilisation de VichUploaderBundle ou gestion manuelle avec Symfony Filesystem, stockage dans le dossier `public/uploads/products/`.

📈 Améliorations possibles

Fonctionnalités

  • Recherche avancée avec filtres
  • Avis clients et notation
  • Favoris / Liste de souhaits
  • Codes promotionnels
  • Multi-langue (i18n)

Technique

  • API REST pour mobile
  • Webhooks Stripe
  • Tableau de bord admin
  • Images multiples par produit
  • Système de notifications

E-commerce

  • Gestion des tailles
  • Stock par taille
  • Comparaison de produits
  • Historique de navigation
  • Recommandations produits

📚 Compétences développées

Framework Symfony

  • Maîtrise de Symfony 7
  • Doctrine ORM 3.5
  • Architecture MVC
  • Formulaires Symfony
  • Sécurité Symfony

Base de données

  • PostgreSQL
  • Migrations (15 migrations)
  • Relations entités
  • Requêtes optimisées

Sécurité web

  • Protection CSRF
  • Chiffrement bcrypt
  • Contrôle d'accès par rôle
  • Validation serveur

Intégrations

  • Stripe (paiements)
  • Dompdf (génération PDF)
  • Symfony Mailer (emails)

Frontend

  • Twig (templates)
  • Bootstrap (responsive)
  • JavaScript moderne
  • Stimulus

Infrastructure

  • Docker
  • Git
  • Tests PHPUnit
  • Débogage Symfony

🎓 Conclusion

Ce projet constitue une application e-commerce complète et fonctionnelle, démontrant une maîtrise approfondie du framework Symfony et des concepts de développement web moderne. L'application intègre tous les composants essentiels d'un site e-commerce : gestion de produits, panier, commandes, paiement sécurisé, et administration.

Points forts :
  • Architecture bien structurée et maintenable
  • Code propre et organisé suivant les conventions Symfony
  • Sécurité prise en compte à tous les niveaux
  • Fonctionnalités complètes pour un e-commerce
  • Documentation claire et installation simple
  • Tests unitaires pour valider les fonctionnalités
Points techniques remarquables :
  • Utilisation de Doctrine ORM pour une gestion efficace de la base de données
  • Intégration complète de Stripe pour les paiements sécurisés
  • Génération de factures PDF professionnelles
  • Système de pagination pour les listes de produits
  • Gestion du panier en session avec persistance

Prochaines étapes : Amélioration de l'interface utilisateur, ajout de fonctionnalités avancées (recherche, avis, favoris), optimisation des performances, et transformation en API REST pour application mobile.