Fabrique d'objets et insertion database

Eléphant du PHP | 135 Messages

12 nov. 2009, 18:02

Hello!

J'ai un j'ai un formulaire qui propose d'ajouter un produit standard avec un choix de type dans une select list !
mais en fonction des choix fais par l'utilisateur, cela ajoute des caractéristiques à ajouter en plus au produit standard
exemple des vêtement la taille !

donc j'ai fais une table MYSQL qui permet d'inséré quelque soit le type de produit ! (taille, poid)
J'ai fais une class Product (Pour le standard) puis j'étends cette class pour les produits plus spécialisé...

mon problème est dans l'insertion des ces produits dans la base !
En fonction du choix de l'utilisateur je construit mon produit exemple :
class ProductFactory
{
    public static function buildProduct($type)
    {
        if(!class_exists($type))
        {
             return throw ProductExeception("affiche l'erreur");
        }

       return new $type();
}
Ensuite je récupère mon objet puis je lui met les méthodes de base commun à chaque produit
on va dire que j'ai class mere A puis une sous-class B qui hérite de A et une sous-class C qui elle même hérite de B et de A

pour l'insert je créer une méthode save pour sauvegarder le product !

si je fais :
public function save(Product $product)
{
     $sql = "INSERT INTO matable (id, name, date, spécial_B, spécial_C) 
               VALUES ($product->getId(), $product->getName(), $product->getSpécial_B(), $product->getSpécial_C());
}
si je met dans la méthode save() un produit spécialisé B ou C il le prendra puisque C ou B est A par définition à l'héritage
mais si je met un produit A il va y avoir un problème puis que il ne connaitera pas $product->getSpéciale_B() ou C !

J'espère avoir été assé claire dans mon éxplication lol

Donc je voudrais savoir si je me complique pas la vie pour rien et si une autre méthode serais préférable !
Le but étant de dupliquer du code pour rien !

de plus j'utilise PDO donc je fais aussi des requetes préparer et j'utilise un tableau pour les marqueur de type (:id, :name) et je créer un méthode params pour éviter
d'avoir à dupliquer mon tableau pour les méhtodes updates etc

je me suis dit aussi que je pouvais utilisé instanceof pour vérifier si c'est une instance de B ou de C pour ajouter les méthodes !
J'ai aussi pensé à étendre la fabrique pour chaque spécialisation mais ca me parais un peu lourd !

Je pense qu'il y'a plus simple donc j'en appel à votre sens de la logique pour m'éclairer !
Zend PHP 5.3 certified ^^

Mammouth du PHP | 1029 Messages

24 nov. 2009, 12:24

Pas bien poster le même problème dans différents forum, mais bon puisque tu n'a pas pris la peine de me répondre sur DVP, et que tu explique mieux ici ton problème, la solution est de surcharger ta méthode save()


CLASS A
public function save(Product $product)
{
     $sql = "INSERT INTO matable (id, name, date)
               VALUES ($product->getId(), $product->getName(),NOW());
}
CLASS B
public function save(Product $product)
{
     $sql = "INSERT INTO matable (id, name, date, spécial_B)
               VALUES ($product->getId(), $product->getName(),NOW() ,$product->getSpécial_B());
}
CLASS C
public function save(Product $product)
{
     $sql = "INSERT INTO matable (id, name, date, spécial_B, spécial_C)
               VALUES ($product->getId(), $product->getName(),NOW(), $product->getSpécial_B(), $product->getSpécial_C());
}
de plus comme tu met un champ date, j'ai rajouté la fonction now() de MySQL, mais tu adapteras.
Modifié en dernier par Maitrepylos le 19 janv. 2010, 09:33, modifié 1 fois.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 135 Messages

24 nov. 2009, 17:09

Salut et merci pour ta 2eme réponse.

Tu n'a pas du vérifier DVP puisque je t'avais répondu.
http://www.developpez.net/forums/d83829 ... ost4799592

Si tu regarde bien les dates tu verra que j'avais posté avant DVP mais que n'ayant pas eu de réponse à mon problème,
j'ai tenté ma chance ailleurs !

Mais c'est pas grave au moin si quelqu'un tombe sur le problème il aura 2 fois plus de chance de trouvé la solution ^^

En attendant je vais analysé ta solution qui m'à l'air pas mal mais j'aurais peut être d'autre questions.
Zend PHP 5.3 certified ^^

Mammouth du PHP | 1029 Messages

25 nov. 2009, 08:48

Désolé pour l'attaque et autant pour moi :)
L'expérience est la somme de toutes nos erreurs.