|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Bonjour,
J'ai eu l'occasion d'intervenir, pendant un stage, sur une application existante en PHP associant POO et base de données. En gros (en simplifiant), on a une classe par table, chaque classe représentant une table. Par exemple, on a les tables News(id_news, titre, contenu, #id_categorie) et Categorie(id_categorie, libelle). On se retrouve donc avec des classes de ce type : Code :
Code :
En procédural, on se serait contenté d'une seule requête avec jointure... Comment procédez-vous sur des cas comme ça ? Bonne soirée. |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() |
Salut floriann,
Ai première vue je dirais un peu comme toi : c'est vachement lourd pour rien. Je pense que la fonction getTousLesArticles() doive se charger de récupérer en une seule passe tous les articles et les catégories correspondantes. En sortie tu récupère un tableau associatif et le tour est joué. Donc je serais toi, je modifierai la requête sous jacente de getTousLesArticles(). |
|
00
|
|
|
#3 |
|
Membre chevronné
![]() Inscription : mars 2005 Messages : 583 ![]() |
Hello,
Question de logique. Une catégorie est un ensemble d'éléments et ces éléments sont des articles. C'est un peu l'inverse qui est implémenté ici. Il serait donc plus logique d'avoir quelque chose de ce genre : Code :
$mesArticles = $maCategorie->getArticles(); Idéalement l'accès aux données devrait se faire de l'"extérieur" de ce genre de classe. Ce qui te permettrait de limiter le nombre de requêtes de la même manière qu'en procédural.
__________________
Pourfendeur de singletons en croisade
|
|
|
00
|
|
|
#4 | |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Mon grain de sel: utilise des adaptateur
http://badger.developpez.com/tutorie...ns/adaptateur/ Le but du jeu c'est d'avoir des objets modèles indifférents au type de média qu'ils utilisent. Donc en d'autres termes, quand tu vas construire ta couche modèle, il faut voir ça comme une pile: les objets de la couche supérieure ne savent pas comment travaillent les objets de la couche en dessous d'eux et ainsi de suite, chacun s'occupe de ce qu'il à a faire et délègue ce qu'il ne sait pas faire à ses copains du dessous. Si tu ne veux pas te lancer la dedans, tu as de très bon projets qui te mâchent le travail: les ORM (Object Relationnal Mapper) qui sont des couches d'abstraction à destination des SGBD relationnelles (99.99% des usages de PHP) capables de comprendre la structure de ton modèle de données relationnel et de te construire les objets qui vont bien. On citera les 2 gagnants du moment: - Propel http://www.propelorm.org/ - Doctrine http://www.doctrine-project.org/ Après y'a toujours la solution "je-suis-un-goret-qui-mets-des-requêtes-sql-dans-des-vues" mais vu que tu a l'air de montrer un intérêt pour la POO en PHP je crois comprendre que tu n'en est pas @Petibidon Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
La solution de Benjamin Delespierre est la plus en adéquation avec ton code , mais nécessitera pas mal de modification pour un gain en performance pas fulgurant. Les ORM quoi que l'on en dise restent très lent comparé à une simple requête bien conçue.
Je suis plus partisan d'avoir une méthode qui retourne tous tes articles avec les jointures adéquates pour avoir toutes les infos. Surtout que dans ton cas si le but est d'afficher le nom de la catégorie associée ça ne vaut peut être pas la peine de créer un objet, faire une requête et appeler une méthode pour chaque élément. |
|
00
|
|
|
#6 | ||||||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Tout d'abord, merci d'avoir pris le temps de me répondre
@Petibidon D'accord avec toi sur le manque de logique de l'emplacement de la méthode Par contre, tu soulèves un point intéressant sur la séparation DB/classes (voir fin de mon message) @Benjamin Delespierre J'ai jeté un coup d'œil sur les adaptateurs mais j'avoue que ça reste très flou pour moi, surtout pour l'implémenter dans une problématique de base de données et d'économie de requêtes. Si tu avais un exemple, ça serait super ! @grunk Dans le code auquel je fais référence, le fonctionnement est parfois comme décrit dans mon premier message, et parfois comme ce que tu préconises (une méthode qui retourne toutes les informations de la requête). J'avoue que ça permet d'économiser les requêtes, mais je trouve que c'est ne pas respecter l'esprit de la POO... et que ça diminue un peu l'intérêt d'utiliser de la POO selon moi. ... Cet après-midi, j'ai un peu réfléchi à la façon dont j'aurais personnellement construit le code (je rappelle que le code présenté ci-dessus n'est pas de moi ; j'avais juste dû intervenir dessus et ça m'avait donné envie de réfléchir sur la "bonne" façon de faire...). L'idée est de se servir des associations. Ainsi, on rajoutera un objet "Categorie" et un objet "Utilisateur" dans notre classe News. Les constructeurs ne chargent plus les données depuis la base de données : Code :
Code :
Code :
Néanmoins, plusieurs points me laissent perplexe : - Si on décide de changer de constructeur demain, il faudra modifier toutes ces méthodes statiques... Sur un gros projet, ça pourrait devenir complexe. - Je trouve qu'il y a une certaine redondance dans l'instanciation des objets. Demain, si je crée une classe Message, où chaque "message" sera posté par un Utilisateur, on aura encore le même travail à faire sur l'instanciation d'Entreprise, puis d'Utilisateur, puis de Message... - Je me dis aussi que ça risque de devenir compliqué quand on aura X objets à instancier, et qu'il faudra remonter toute la hiérarchie (là, on a déjà entreprise -> utilisateur -> news... on peut imaginer des cas plus complexe où ça risque de devenir une usine à gaz ?) - On a un structure des classes légèrement différente du modèle relationnel de la BD puisqu'on ajoute les objets correspond aux différents ID (id_catégorie, id_utilisateur...). Bref, qu'en pensez-vous ? J'espère avoir été un minimum clair. Bonne soirée et merci d'avancer pour vos avis toujours très intéressants. |
||||||
|
|
00
|
|
|
#7 |
![]() ![]() Inscription : septembre 2010 Messages : 7 101 ![]() |
avec PDO tu pourrais faire du FETCH_CLASS direct meme avec un FETCH_ALL
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#8 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Heu... Un exemple d'utilisation des adaptateur ? Vu que je suis en train de le réaliser ça va être assez tendax là...
Y'en avait pas dans la doc que je t'ai filé ?? Je peux te fournir quelques signatures si ça peut t'aider : Code :
Ensuite on crées un Adaptateur de bdd et un adaptateur de fichier, à toi de voir en fonction de tes besoins comment implémenter tout ça. Et au final on a une class MyModelClass qui peut se voir attacher un adaptateur pour effectuer ses lectures / écritures. Cette classe ne devra porter aucune information relative au média qu'elle utilise sinon l'adaptateur pour ce média.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 15 ![]() |
Hum, c'est vague pour un débutant en POO comme moi. Faut que je réfléchisse à tout ça.
Sinon, personne n'a de remarques/avis sur la proposition de solution que j'ai faite ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com