Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
J'aimerais savoir ce que représente pour vous le "M" et de quelle manière l'utiliser vous ? Avec exemple à disposition. De nombreux tutaux représentent chaque table dans la base de données par un objet PHP. Qu'en pensez vous ? Utilisez vous une manière différente de récupérer vos données ? Faites vous du full loading ou du lazy loading (chargement total des données au lancement de l'appli ou au coup par coup) ? comment organisez vous vos fichiers ? Mettez y vous d'autres choses que vos objets pour accéder aux données ? En fait, je me paume un peu sous l'info que le "M" représente un peu tout et n'importe quoi apparemment.
N'hésitez pas à être le plus exhaustif possible, je me délecterais de vos réponses :p
PS : Si possible, pensez à ponctuer par des exemples pour rendre la réponse plus compréhensible.
Merci à ceux qui oseront aider @( ^_^ )@
Dernière modification par apsy (22-04-2008 14:22:26)
Hors ligne
Bonjour apsy,
La définition du modèle (le "M" de MVC) dépend un peu des gens, des technos... mais en gros, l'idée est la suivante :
Le modèle c'est l'ensemble des classes qui permettent de manipuler les données de ton application, indépendament de ton projet.
Si tu imagines un système d'information d'une entreprise, ton modèle, c'est l'ensemble des classes qui te permettent de faire des opérations du genre :
- créer un salarié
- modifier un salarié
- créer un client
- créer un projet
- associer un salarié à un projet
- créer une facture associée à un projet
...
Toutes ces fonctions ne dépendent pas de ton projet lui même.
Ensuite par dessus tout ça tu peux avoir plusieurs accès différents aux données de l'entreprise :
- un soft en dur pour le service compta
- un intranet (web) pour les employés
- un extranet pour les clients ou les partenaires
Mais dans tous les cas, le modèle reste inchangé...
En général on considère que le modèle, c'est plutôt l'ensemble des classes qui permettent ces accès aux données... le modèle de données en base c'est juste un moyen... les données pourraient aussi bien être dans des fichiers textes, xml ou autre....
Maintenant ta question est très soumise à débat, notamment parce que la notion de MVC est assez différente dans les technos web et les interfaces lourdes... Comme tu dis ça veut tout et rien dire , mais j'ai essayé de te donner l'esprit général du modèle de façon simple...
A+, Philippe
Hors ligne
Pour imager, un modele veut dire ce qu'il veut dire.
Tu veux dessiner une voiture spécifique, et tu as à coté de toi un modele. Grace à ce model, tu sais ou mettre les roues, comment dessiner les phares etc.. De plus, tu possèdes les bon stylos pour la faire, la bonne gomme, ...
Beh, c'est pareil, sauf que les models dans MVC fournissent aussi les stylos et les gommes.
Hors ligne
je reprends à mon compte les dire de Philippe.
pour faciliter le travail je "concrétise" le modèle dans ZF par un objet dans le contrôleur
$this->model. cet objet est une façade c'est à dire qu'il ne fait rien lui-même mais va chercher dans l'ensemble des classes du modèle le bon objet pour faire le boulot. cela défini une API tout en cachant la complexité qui est derrière.
ainsi les contrôleurs peuvent évoluer indépendamment du modèle et vice versa.
A+JYT
Hors ligne
J'ai aussi adopté cette technique qui me plait bien suite à ton bonne article Utiliser une façace pour accéder au modèle
D'ailleurs au passage, merci pour tes articles qui m'ont tous fait monter en xp
Hors ligne
J'avoue que j'ai du mal à comprendre votre technique.
Je n'utilise pas Zend_Db mais phpdoctrine, et peut etre que c'est différents.
Pour faire une nouvelle voiture par exemple, je fais
$voiture = new Voiture();
$voiture->roues = "17 pouces";
$voiture-save();
Pour avoir la liste de mes voitures :
$voitures = Doctrine::getTable('voiture')->findAll();
C'est donc Doctrine ma facade ??
Hors ligne
Ben ouais. avec la petite différence que tu utilise une facade statique apparemement
Pour reprendre ton exemple, je coderais ça ainsi:
$voiture = $this->model->voitures->new(); $voiture->roues = "17 pouces"; $voiture-save(); $voitures = $this->model->voitures->findAll();
Dernière modification par Mr.MoOx (23-04-2008 11:07:30)
Hors ligne
Ok, donc, aucun interet pour moi alors..
Hors ligne
si car si voitures n'est plus une une table dans la base de donnée mais un appel de service web ou un fichier XML ou tout autre chose tu ne change rien de tes contrôleurs
A+JYT
Hors ligne
Imaginons je souhaite récupérer les roues de mon véhicule ? Comment dois je m'y prendre ? Quelles sont les dépendances entre les objets ? Comment les récuperent on ? Un exemple de code ?
$voiture = $this->model->voitures->new(); $voiture->roues = "17 pouces"; $voiture-save(); $voitures = $this->model->voitures->findAll(); foreach($voitures as $voiture) { $roues = $voiture->getRoues(); $roues->changePneu('MICHELIN XX'); $voiture->changeRoues($roues); $voiture->save(); }
Si l'on prend ce code, on a plusieurs objets "Voiture", "Pneu" et une collection de Pneus.
Comment fonctionne la dépendance entre ces classes ? Lors de l'appel au save, que sauvegarde t'on ? Comment sait on quelles sont les données qui ont changé ?
Hors ligne
Là il n'y a pas de réponse toute faite, parce qu'il y a des écoles très différentes.
Ecole 1 :
- les entités (voiture, roue, pneus,...) ne gèrent jamais les échanges avec la base. on a des manager à coté qui vont prendre en charge les interactions avec la base et qui vont renvoyer les entités qui vont bien.
// récupérer la liste des roues $roueListe = $manager->getWheelListForCar($carId); // sauvegarder une roue $manager->saveWheel($roue);
Ecole 2 : (doctrine fonctionne comme ça je crois)
- les entités ne font une bonne partie des opérations, mais des managers font des opérations avant la création des objets
$roue = $manager->findById($roueId); // sauvegarder une roue $roue->save()
Ecole 3 : (cf Zend_Db_Table)
- On n'a pas vraiment d'entité, par contre on a un manager par type d'objet (c'est un peu l'approche ZF avec Zend_Db_Table)
// récupération de la liste des roues, $roueManager est ton Zend_Db_Table, ton rowset serait ton entité, mais elle n'est pas spécialisée $rowset = $roueManager->findByCarId($carId);
Aucune des solution n'est parfaitement satisfaisante. Elles ont toutes leurs avantages et leurs défaut (il y a d'autres approches plus ou moins intermédiaires et souvent assez complexes : SDO, EJB,...).
Perso je suis un adepte de l'école 1. L'approche ZF est plutôt l'école 3.
Le mieux est que tu essayes chaque solution déjà pour comprendre pratiquement les implications de chaque méthode (nombre d'objets à coder, maintenance, facilité d'utilisation de ton modèle dans le controlleur,...).
A+, Philippe
Hors ligne
C'est des habitudes à connaitre pour chaque ORM..
De plus, philippe, on ne voit plus vraiment le manager dans doctrine puisqu'on fait
$voiture = Doctrine::getTable('voitures')->findOneById($id);
$voitures = Doctrine::getTable('voitures')->findAll();
$voiture = Doctrine::getTable('voitures')->findOneByMarque($marque);
Ce qui est plus 'évident' à lire
Mais, il y tellement de solution dans doctrine.. je crois qu'on peut faire les 3
Hors ligne
Bonjour,
je suis adepte de la metohde 1 moi aussi.
Je n'utilise donc pas Zend_Db_Table .. et autre.
J'ecris mes requete donc a la mimine dans mes manager qui n'ont que des methodes static.
Chaque manager possède un champs db (Zend_Db_Adapter_Pdo_Abstract) que je gere comme un singleton.
J'aimerai savoir comment les adepte de manager s'en sortent, car j'ai l'impression de passer à coté d'une bonne partie de ce que peux offrir le Zend.
Dernière modification par ichevc02 (24-04-2008 11:15:21)
Hors ligne
Imaginons 3 tables dans une base de données quelconque :
- Voiture
- Roues
- Moteur
Comment faites vous après soumission d'un formulaire ? Vous crée 3 objets Zend_Db_Table correspondant à vos 3 tableS ? Puis créez dans votre controlleur un object voiture auquel vous rattachez votre autres objets ? Je vous pas bien la logique en faite :s
Quelqu'un pourrait me faire un exmple simple mais me permettant de mieu comprendre la mécanique ?
De plus, comment organisez vous vos fichiers ?
Hors ligne
un voiture est un objet fait d'un moteur et de 4 roues
lorsqu'on enregistre une voiture on ouvre une transaction on crée la voiture dans la base on récupère son id et ensuite un enregistre les roues et le moteur à la première erreur d'enregistrement on fait un rollback (on n'enregistre rien) si tout c'est bien passé on fait un commit (on enregistre tout)
les méthodes insert et update de la classes de liaison au données des voitures (Car_Table) doivent être surcharger pour exécuter cette transaction
rien à changer dans les contrôleurs c'est un problème Model
A+JYT
Hors ligne