C'est du MVC ça ? - PHP - Programmation
Marsh Posté le 28-09-2010 à 10:03:00
Ouais ça y ressemble.
Par contre attention les formulaires d'insertion, ça se fait en POST, pas en GET
Marsh Posté le 28-09-2010 à 10:13:44
Il y a moyen d'écrire ceci autrement ?
$manager = new ClientManager();
$managerv = new VilleManager();
Genre parfois j'ai 10 instances à créer je suis obliger d'avoir 10 ligne pour choper les données ...
Marsh Posté le 28-09-2010 à 10:45:40
Je comprend pas la question
Marsh Posté le 28-09-2010 à 10:49:02
hmmmm, bah je sais pas, genre dans mon controlleur de reservation j'ai ceci :
$managerreservation = new ReservationManager();
$managerclient = new ClientManager();
$managerville = new VilleManager();
$managervillage = new VillageManager();
$reservations = $managerreservation->getList();
$this->registry->template->reservations = $reservations;
$this->registry->template->managerville = $managerville;
$this->registry->template->managervillage = $managervillage;
$this->registry->template->managerclient = $managerclient;
$this->registry->template->show('reservation');
Ca me parrait pas propre.
Par exemple pour $reservations = $managerreservation->getList();
je peux pas faire ça plutot : $reservations = ManagerReservation::getList(); ?
Marsh Posté le 28-09-2010 à 11:13:26
Ah, ça ça dépend de ta classe bien sûr
Si "getList()" retourne un résultat indépendant de l'instance de managerreservation, bien sur il faut le mettre comme méthode statique
Bref, on peut pas te répondre sans connaître ta structure et ton code
Edit :
Tu peux quand même un peu compacter ton code en remplaçant les :
Code :
|
par des
Code :
|
Marsh Posté le 28-09-2010 à 23:22:53
tu peux aussi passer par une classe de configuration qui instancie pour toi les classes que tu as besoin.
Marsh Posté le 28-09-2010 à 23:58:10
il existe une librairy dans la SPL http://www.php.net/manual/fr/function.spl-autoload.php regarde les exemple
Edit : perso je l'utilise et je n'est plus aucun require_once dans mes classes...
juste un pour charger mon fichier de config
Marsh Posté le 29-09-2010 à 08:57:42
Encore une brillante idée de PHP cet autoload ...
On dirait que les dev ne se posent jamais la question de savoir pourquoi leur langage est le seul de la planète à proposer certaines fonctionnalités loufoques.
Genre en mettant du autoload dans tous les sens, bonne chance pour savoir ce que fait exactement ton script.. sans parler des effets de bord potentiels
Marsh Posté le 29-09-2010 à 10:58:36
je sais exactement ce que fais mon script, l'autoload n'est utilisé que quand j'instancie une classe ou que je fais appel à une fonction static dans une classe.
ça m'évite de faire des require_once à tout va sans être sur que la classe soit nécessaire au script à ce moment-là.
En même temps de gros projets comme DOCTRINE utilise l'autoload via la SPL...
Marsh Posté le 29-09-2010 à 11:08:07
Question de goûts peut-être.. Et dire que des gros projets utilisent quelque chose n'est pas forcément gage de qualité (suffi de voir le nombre de gros projets qui se sont trouvés dans la merde).
Par contre, même en utilisant autoload, ça va pas lui simplifier la vie concernant le fait qu'il doit créer ses objets et qu'il a l'air de ne pas avoir envie de le faire "à la main".
À part essayer de feinter le coup en implémentant un semblant de meta-programmation à grand coups de "eval" (ce qui va être un vrai horreur à mon sens), je vois pas comment il peut éviter d'écrire ces lignes.
Marsh Posté le 29-09-2010 à 11:13:58
sur le point de "lui simplifier la vie concernant le fait qu'il doit créer ses objets" on peut aussi voir le pattern factory, mais il faut un minimum de parametre, sinon revoir la conception de ses classes, il pourrait intégrer dans le constructeur de l'une de ses classes intégrer l'instanciation des ces objets... mais avec "$this" il est déjà dans ça classe
Marsh Posté le 29-09-2010 à 12:43:38
Bof, outre les problèmes éventuels d'implémentation, moi je vois ce genre de combine généralement d'un mauvais oeil parce que ça te crée des classes qui n'ont aucun sens d'un point de vue système..
Tes factories sont là uniquement parce que t'as une pétée d'objets et que t’arrive pas à leur courir après. Mais du coup, je trouve que t'y perd quand même vachement en clarté quant tu voies des classes "factory" à tort et à travers dans ton UML.
Enfin bon, au fond dans un langage sans grandes possibilités de meta-programmation, t'as pas non plus 36'000 choix en effet
Marsh Posté le 29-09-2010 à 15:31:52
Post constructif :
on peut factoriser le code :
je présume que les fichiers XX.class.php comme par exemple : Client.class.php sont les même ?
si oui tu peux créer une classe générique pour mettre les données à l'intérieur
Code :
|
le rouge ne sert plus à rien, ensuite il faut bien sûr faire quelque contrôle, notamment sur __get pour vérifier si la clé existe et __set pour vérifier que la clé n'existe pas pour ne pas effacer la précédente valeur.
ensuite clientmanager et clientcontroller sont presque identique ??
et baseController il y a quoi à l'intérieur ?
tu peux ensuite réfléchir à une solution pour encore plus factoriser ton code en utilisant des parametres pour instancier tes classes automatiquement.
à suivre ....
Marsh Posté le 29-09-2010 à 15:46:41
En fait je suis partis de cet espece de framework mvc :
http://phpro.org/tutorials/Model-V [...] r-MVC.html
Tu trouves que clientmanager et clientcontroller sont presque identique ? Bah euh ... mon clientcontroller est mon contrôleur d'action et l'autre ma classe métier qui vas me permettre d'accéder au données. Je ne comprend pas trop ton affirmation/question ( faut dire que je ne comprend pas grand chose non plus haha ).
Marsh Posté le 29-09-2010 à 16:13:07
Anycee : stef_dobermann essaie de t'aider à compacter ton code en créant une classe générique.
Par contre, je ne pense pas que ce soit la bonne manière de s'y prendre si on ne connaît pas la structure UML du projet.
Marsh Posté le 29-09-2010 à 17:03:25
c'est vrai, mais c'est juste pour lui donner des pistes à creuser
Edit : sinon on lui fait l'application et ce n'est pas le but du forum
Marsh Posté le 29-09-2010 à 18:34:34
Non certes, mais si on connait sa structure, on peut l'orienter vers le bon design pattern.
Encore que ... franchement en PHP je trouve que ça vaut presque pas la peine.. Quand tu essaies de faire les choses proprement, tu passes 90% de ton temps à te battre contre le langage qui lui, veut faire les choses autrement
Marsh Posté le 29-09-2010 à 20:22:59
Merci à vous en tout cas de m'aider c'est sympa
Bon ! Déjà le MVC ça a l'air good, maintenant concernant l'optimisation de mes classes, comme j'ai dit tout a l'heure je suis parti du framework linké plus haut auquel j'ai ajouté mes classes etc ...
Si ça peut vous en dire un peu plus voici un MCD http://img695.imageshack.us/i/mcde.jpg/
J'ai créer une classe .class.php ainsi qu'un XXXXManager.class.php pour chaque entitée.
Du coup dans mon contrôleur pour charger les données du model ça donne un truc genre ça dans mon contrôleur d'action Réservation reservationController.php : http://pastebin.com/ZLY3568V
Ce que je veux surtout, c'est que mon code soit propre. Je galère vraiment ... Qu'est-ce que j'aimerai avoir un vrai formateur php poo ... Vive l'afpa !
Marsh Posté le 29-09-2010 à 23:37:21
d'après "l'espèce de frameworks "
Code :
|
en rouge il instancie la classe que l'utilisateur veut
en bleu il exécute l'action par exemple getlist()
et tout cela en analysant l'URL
Marsh Posté le 30-09-2010 à 08:51:45
Mm moui comme ça pourquoi pas. J'ai juste quelques doutes sur le "is_callable". Sauf erreur il peut créer des soucis si tu as genre une méthode statique ou private. De plus il ne detecte pas correctement les fonctions desactivées dans le php.ini il me semble.
Faudra probablement le wrapper dans quelque chose.
Mais sinon sur le principe, pas mal
Marsh Posté le 30-09-2010 à 09:07:24
Yep steff_doberman j'avais compris ( pour une fois ) ces grandes lignes.
Par contre je ne comprend pas cette ligne. $class = $this->controller . 'Controller_';
Sinon en gros, si j'appel le module "client" il vas instancier ma classe client. génial mais ça me sers à rien vu que ma classe client j'en ai pas besoin, j'ai besoin de ma classe ManagerClient.class.php pour charger mes données.
Marsh Posté le 30-09-2010 à 10:03:43
Son code te permet de faire un système qui détermine automatiquement quel contrôleur est nécessaire en fonction de l'URL, et appelle la bonne action (toujours en se basant sur l'URL).
Après, dans ton contrôleur, tu vas devoir de toutes façons instancier ton modèle "à la main".
Une fois ceci étant fait, tu peux (et ça serait d'ailleurs une bonne idée) compléter son loader par un appel à la vue, qui récupérerai une propriété cachée dans ton contrôleur afin de mettre en forme l'output
Marsh Posté le 30-09-2010 à 10:27:37
Oui c'est déjà comme ça que ça se fait.
Dans mon controlleur d'action, une fois les données recuperer par le model j'ai
$this->registry->template->show('client');
et voila ma class template :
http://pastebin.com/DrjJRT1Y
Marsh Posté le 30-09-2010 à 11:18:42
esox_ch a écrit : Son code te permet de faire un système qui détermine automatiquement quel contrôleur est nécessaire en fonction de l'URL, et appelle la bonne action (toujours en se basant sur l'URL). |
Alors rendons à Césars ce qui appartiens à Césars, le code présenté plus haut viens du frameworks de Anycee http://phpro.org/tutorials/Model-V [...] r-MVC.html
j'ai juste fait un copié collé
Marsh Posté le 30-09-2010 à 11:38:05
anycee a écrit : Yep steff_doberman j'avais compris ( pour une fois ) ces grandes lignes. |
cette ligne te permet de construire le nom de la classe mais ils ont dû se tromper quelques part.
toi tu n'as qu'à modifier cette ligne en
Code :
|
et la méthode getController dont voici le code :
Code :
|
c'est la partie rouge qui nous interresse :
par exemple pour charger le fichier ManagerClient.class.php qui contient la classe ClientManager, il faut que tu la modifie en
Code :
|
voila avec ça ton include est automatique, ton instanciation aussi, et l'exécution de ton action aussi
attention toute fois aux 2 ligne verte qui initialise un contrôleur et une action par défaut, ta classe doit comporter une méthode index, ou bien tu modifie la deuxième ligne verte en remplaçant index par getlist.
Edit :
pour finir, la ligne jaune faut pareil mais pour le contrôleur ...
Marsh Posté le 30-09-2010 à 11:53:38
esox_ch a écrit : Mm moui comme ça pourquoi pas. J'ai juste quelques doutes sur le "is_callable". Sauf erreur il peut créer des soucis si tu as genre une méthode statique ou private. De plus il ne detecte pas correctement les fonctions desactivées dans le php.ini il me semble. |
on pourrait rempler is_callable par method_exists au pire
Marsh Posté le 30-09-2010 à 12:53:25
Oui mais là aussi, tout est pas rose sauf erreur. J'ai vu quelque part sur la doc un mec qui a fait une méthode qui gère tous les cas de figure avec les méthodes qui-vont-bien. C'est pas un gros problème de tt façons, faut juste le savoir si tu veux te baser lourdement dessus
Marsh Posté le 03-10-2010 à 12:36:56
Tiens ptite question encore. J'ai un lien qui genère une facture PDF, c'est bien le controlleur qui vas charger les données du pdf et la vue, generer le pdf ?
Marsh Posté le 03-10-2010 à 13:45:36
oui exactement
Marsh Posté le 03-10-2010 à 19:52:10
esox_ch a écrit :
|
C'est marrant comme les choses semblent évoluer. En 2010, on semble moins faire du PHP "cra-cra" (=sans MVC ni séparation en couches) au profit d'une programmation plus modulaire et c'est bien.
Mais du code comme au-dessus, genre registry pattern, ça me fait penser à la façon de faire en J2EE d'il y a dix ans. Et on ne veut plus ça aujourd'hui en J2EE, parce que c'est vite lourd, et qu'on a des belles annotations genre @Inject (JSR-330), ou de manière plus évidente Spring pour la DI et tout le reste.
On peut espérer que PHP ne suivra pas la même évolution. En voulant tout modulariser et tout rendre flexible, on peut vite se ramasser. Si quelqu'un arrive et dit : "hé, on pourrait déclarer les ressources, les controllers et tout ça dans un fichier en dehors du code, par exemple dans un fichier XML, et ce serait vachement plus propre", il sera temps de quitter le navire radeau.
Mes 2 cents très philosophiques du dimanche soir
Marsh Posté le 03-10-2010 à 21:37:13
À voir PHP6 et les brillantes décisions qui ont été prises par les dev, je pense que bientôt ça sera plus 10 ans de retard que PHP aura ... mais 20..
Marsh Posté le 17-10-2010 à 18:26:51
esox_ch a écrit : À voir PHP6 et les brillantes décisions qui ont été prises par les dev |
Comme quoi? On dirait plutôt que PHP fait du surplace.
Spoiler : we are hs |
Marsh Posté le 18-10-2010 à 11:41:42
La plupart des changements me semblent plutôt inutiles, mais quand je lis ça:
Citation : Goto |
ça me fait penser que PHP ne sait vraiment pas ce qu'il se veut... Genre "PHP5 c'est pour devenir OO", et maintenant, on introduit goto?
Marsh Posté le 18-10-2010 à 12:01:54
Mouais ... je pense qu'il y a quand même des problèmes de fonds plus importants en PHP à traiter que de rajouter une fonctionnalité goto-like à break Oo
Marsh Posté le 24-04-2019 à 17:36:53
Bonjour,
je répond un peu tardivement mais je souhaite également avoir un avis pour mon MVC.
Ici une image de la structure:
Et ci-dessous quelques liens vers:
- index: https://pastebin.com/bP10we2R
- controller_classe: https://pastebin.com/QaCUM0hX
- model_class: https://pastebin.com/4BHtBvkk
- view_class: https://pastebin.com/wYjLYquT
- listall_view: https://pastebin.com/4cPCxaA9
- car_controller: https://pastebin.com/qidisTY6
Merci beaucoup pour votre avis
Cordialement,
Henry
Marsh Posté le 26-04-2019 à 09:07:39
J'ai oublié d'ajouter la partie avec la session dans ma réponse, la voici ci dessous:
La classe principale:
Code :
|
Et le controleur pour l'utilisateur:
Code :
|
et finalement la vue pour le login:
Code :
|
Marsh Posté le 28-09-2010 à 09:59:07
Bonjour à tous,
Pour la première fois j'essaie de créer une application en MVC et PHP POO et j'aimerai votre avis et surtout que vous me disiez si pour vous, c'est bien du mvc
( J'avais déjà créer un post mais je ne savais pas s'il valait mieux que j'en recréer un ou que je continue à poster dessu ... )
Mon application web est structuré comme ceci :
/application
controller_base.class.php
template.class.php
router.class.php
/controller
clientController.php
reservationController.php
/model
Client.class.php
ClientManager.class.php
Reservation.class.php
ReservationManager.class.php
/views
client.php
seeclient.php
reservation.php
seeresa.php
Je vous ai mis un lien vers un controller, une vue, une classe.
Si vous voyez des choses bizarre n'hésitez pas, je débute aussi dans la POO ....
Merci d'avance