IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

garantir l'intégrité d'une commande


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut garantir l'intégrité d'une commande
    Bonjour,

    Je travaille sur un site de vente en ligne sur mesure (produits particuliers, ça ne rentre pas vraiment dans les cases d'un prestashop ou d'un sylius). C'est en Symfony 6.

    Mon problème.. J'avais commencé par faire une table de commande assez classique, liée à un membre, adresse de livraison, adresse de facturation, des "order items", eux mêmes liés à des "products"..

    Mais je me dis que si un membre passe une commande, puis qu'un admin modifie le prix d'un produit, ou le membre modifie son adresse de livraison, par exemple, ça va casser l'intégrité de la commande.

    Du coup j'ai commencé à ajouter des champs dans mon entité commande pour stocker toutes les informations au moment de la commande plutôt que d'avoir des relations entre les tables.. Ça solutionne une partie de mon problème.. Mais après pour retrouver les informations, ça va être un poil pénible vu que ça va être une liste de champs, au lieu d'objets bien définis.. (et mes templates fonctionnent beaucoup avec des appels de fragments et une seule variable passée, l'objet à rendre, par exemple pour les blocs d'adresse).

    Du coup, je me demandais si il ne serait pas plus simple de cloner la ligne d'adresse / membre / produit / etc.. et de lier ma commande à ces objets clonés .. et marqués avec un champ "invisible" par exemple.. Ou alors carrément dans une table séparée.. ?

    Qu'en pensez vous ?

    Merci !

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2024
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2024
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut

    Citation Envoyé par zevince Voir le message
    puis qu'un admin modifie le prix d'un produit
    Non !

    On ne modifie pas un prix de produit. On crée/ajoute un nouveau prix à un produit. En définissant que c'est le prix "actuel" pour le catalogue. Donc les anciens prix sont conservés sur les anciennes commandes.

    Techniquement, le prix n'est pas une valeur (int 33 euros) d'un objet Produit. Le prix est un objet (table SQL). Et y'a une table associative Produit <-> Prix.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Product { 
       // @ORM\OneToOne ...
       private Price $price;  
       public function setPrice(Price $price): void
      {
         $this->price = $price;
       }
    }
    class Price {
       public function __construct(private int $value) {
       }
       public function getValue(): int
       { 
           return $this->value; 
       }
       // pas de setValue ! (immutable)
    }
    Sinon pour faire plus solide et joli, un catalogue n'affiche pas des "produits" mais des ProductOffers : un objet constitué de Produit+Prix. Et les acheteurs commandent des ProductOffers. Et pour faire joli, au lieu d'un prix, c'est une Offer (mélange de prix, période de l'année, solde particulière, etc).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class ProductOffer {
        private Product $product;
        private Offer $offer;
    }
    class Offer {
       private Price $price;
       private Promotion $promotion;
       private TypeAcheteur $typeAcheteur;
       private ReductionFidelite $reductionFidelite;
       ...
    }
    ou le membre modifie son adresse de livraison
    NON ! Pareil. Une fois la commande validée, on ne modifie plus l'adresse. On crée une nouvelle adresse et on la relie au membre.


    Du coup, je me demandais si il ne serait pas plus simple de cloner la ligne d'adresse / membre / produit / etc.. et de lier ma commande à ces objets clonés ..
    Non.

    Le clone, c'est un jouet pour étudiants. Dans le beau code, y'a jamais.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    Citation Envoyé par Newton13 Voir le message
    On ne modifie pas un prix de produit. On crée/ajoute un nouveau prix à un produit. En définissant que c'est le prix "actuel" pour le catalogue. Donc les anciens prix sont conservés sur les anciennes commandes.
    Ça c'est ce que je fais déjà actuellement, un produit ne peut pas être modifié, seulement archivé et recréé, mais la commande n'est pas liée qu'au produit, elle est liée a l'utilisateur, aux adresses, etc..). Et ça n'est pas pratique pour les administrateurs de la boutique.

    Citation Envoyé par Newton13 Voir le message
    Techniquement, le prix n'est pas une valeur (int 33 euros) d'un objet Produit. Le prix est un objet (table SQL). Et y'a une table associative Produit <-> Prix.
    J'utilise MoneyPHP pour gérer les prix de façon sûre, et dans ce cas, pas de table associative, juste un champ dans la table produit, mais je ne vois pas trop le rapport ?


    Citation Envoyé par Newton13 Voir le message
    NON ! Pareil. Une fois la commande validée, on ne modifie plus l'adresse. On crée une nouvelle adresse et on la relie au membre.
    Ca c'est un peu ce que je suggérais, en clonant une ligne pour la garder "intacte"..

    Enfin merci pour ta réponse.

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 219
    Points
    8 219
    Billets dans le blog
    17
    Par défaut
    J'utilise MoneyPHP pour gérer les prix de façon sûre, et dans ce cas, pas de table associative, juste un champ dans la table produit, mais je ne vois pas trop le rapport ?
    Et comment changes-tu le prix d'un produit ? Tu créées un nouveau produit ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Et comment changes-tu le prix d'un produit ? Tu créées un nouveau produit ?
    Oui, on archive le produit (juste un champ booleen dans la table) et on en recrée un nouveau..
    Mais je vais faire comme je pensais au début, juste stocker les infos au moment de la commande.. Ça sera le plus sûr.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    489
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 489
    Points : 388
    Points
    388
    Par défaut
    Bon, voila, au final j'ai modifié les users, on ne peut plus les supprimer, juste les marquer inactifs, si ils ont des commandes enregistrées. Pareil pour les adresses, on peut créer / supprimer mais plus modifier. et les produits c'était deja le cas.. Donc résolu, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire le résultat d'une commande dans un fichier de l' OS
    Par Labienus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/02/2004, 11h04
  2. [LG]plantage sur une commande basique !
    Par Jeff on the web dans le forum Langage
    Réponses: 5
    Dernier message: 13/01/2004, 19h07
  3. Passage d'une commande à un programme
    Par nicolas.pissard dans le forum C++Builder
    Réponses: 5
    Dernier message: 04/11/2003, 13h37
  4. Réponses: 2
    Dernier message: 24/06/2003, 20h31
  5. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo