Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1546 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  62  63  64  65  66  67
Auteur Sujet :

Model View Controller (MVC) - Architecture des applications PHP

n°1204132
skeye
Posté le 21-09-2005 à 11:32:05  profilanswer
 

Reprise du message précédent :

omega2 a écrit :

La partie qui gére l'affichage, elle est pas sencé faire partie de la section "vue" du MVC?


 
ben si, mais où est-ce que j'ai parlé de la partie qui gère l'affichage, moi? [:pingouino]
J'ai dit que j'accédais directement à la base sans surcouche dans le modèle, c'est tout...[:urd]


---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le 21-09-2005 à 11:32:05  profilanswer
 

n°1204140
skeye
Posté le 21-09-2005 à 11:37:35  profilanswer
 

nraynaud a écrit :

j'ai toujours eu un problème avec cet aspect, en particulier pour la démarcation des transactions.
 
En pratique dans le monde du web, tu peux faire un pire cas avec acquisition de la connection+démarrage de transaction à la réception de la requette, et relachement + commit au moment du renvoit de la réponse.  
 
Si tu veux faire des choses plus fines (ce que j'espère), il te faudra un objet représentant le TransactionManager, et il stockera la connection lui-même et te le masquera dans l'objet transaction qu'il te donnera au début de transaction.


 
Je suis pas sûr de bien faire le lien entre ce que tu racontes et ce que j'implémente exactement derrière.[:petrus75]
 
Ca donnerait une classe TransactionManager (un singleton, je suppose?), qui stocke la connexion et effectue toutes les opérations sur la base lui-même?
Et à ce moment là dans toutes la classes de mon modèle j'instancie cette classe quand j'en ai besoin...?


---------------
Can't buy what I want because it's free -
n°1204147
omega2
Posté le 21-09-2005 à 11:40:58  profilanswer
 

skeye a écrit :

ben si, mais où est-ce que j'ai parlé de la partie qui gère l'affichage, moi? [:pingouino]
J'ai dit que j'accédais directement à la base sans surcouche dans le modèle, c'est tout...[:urd]


J'ai trop l'habitude d'utiliser les terme "modéle" en rapport avec le "gestionnaire de modéle d'affichage" (j'aime pas le terme template. :p) quand je parle de la partie qui s'occupe de l'affichage.
J'ai donc crus que tu parlais de ça quand t'as dit que t'avais des accés à la base de donnée directement dans ton "modéle".

n°1204189
nraynaud
lol
Posté le 21-09-2005 à 11:59:43  profilanswer
 

skeye a écrit :

Je suis pas sûr de bien faire le lien entre ce que tu racontes et ce que j'implémente exactement derrière.[:petrus75]
 
Ca donnerait une classe TransactionManager (un singleton, je suppose?), qui stocke la connexion et effectue toutes les opérations sur la base lui-même?
Et à ce moment là dans toutes la classes de mon modèle j'instancie cette classe quand j'en ai besoin...?


nan, tu fais un  

Code :
  1. Transaction trans = manager.newTransaction()
  2. trans.begin();
  3. try{
  4.   pouet pouet
  5.   trans.commit();
  6. } catch (Exception e) {
  7.   trans.rollback();
  8.   e.throw();
  9. }


---------------
trainoo.com, c'est fini
n°1204209
FlorentG
Unité de Masse
Posté le 21-09-2005 à 12:13:50  profilanswer
 

Ce que je pense faire, c'est un truc du genre :
 
Toutes les actions & commandes viennent dans des objets Command (voir Command Pattern ) :
[considérez ces exemples comme du pseudo-code]

class UserAddCommand {
 
  var required_filters('authentification', 'transaction');
 
  function execute {
 
    // Ajout d'un utilisateur
  }
 
  function get_view {
 
    // Là on retourne la view obtenue
  }
}


 
Pis on a un système de "Filters". Avant de lancer la command, on exécute différents filtres, qui s'occuperont de voir si la commande nécessite une connexion, une transaction, une authentification. Pis après la commande, on réexécute les filtres s'il le faut. Ca permet de gérer automatiquement tout ça.

class TransactionFilter {
   
  function pre_execute($command) {
 
    if(isset($command->required_filters('transaction'))) {
 
       // démarre une transaction
    }
  }
 
  function post_execute() {
 
     // si y'a eu une transaction -> commit
  }
}
 
class AuthentificationFilter {
 
  function pre_execute($command) {
 
    if(isset($command->required_filters('authentification'))) {
 
       // regarde si l'utilisateur est authentifié, etc.
    }
  }
}

n°1204283
skeye
Posté le 21-09-2005 à 13:48:46  profilanswer
 

nraynaud a écrit :

nan, tu fais un  

Code :
  1. Transaction trans = manager.newTransaction()
  2. trans.begin();
  3. try{
  4.   pouet pouet
  5.   trans.commit();
  6. } catch (Exception e) {
  7.   trans.rollback();
  8.   e.throw();
  9. }



 
ah, ok...[:dawa]


---------------
Can't buy what I want because it's free -
n°1205819
plainsofpa​in
Pingouino's lover
Posté le 23-09-2005 à 12:13:16  profilanswer
 

up de ce topic important, j'ai débuté mon propre framework en MVC, vu que pour apprendre faut se lancer :)
 
Je séparais deja les couches controles/vues des modèles, dans mes dev précedents. Séparer la couche de controles de la couche de vue, ca a pas l'air super difficile non plus :)
 
Je vous emmerderai si j'ai des problèmes :p


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
n°1205876
nraynaud
lol
Posté le 23-09-2005 à 14:01:44  profilanswer
 

au fait, je vous rappelle que dans le monde normal, la vue est un listener du modèle.


---------------
trainoo.com, c'est fini
n°1206077
FlorentG
Unité de Masse
Posté le 23-09-2005 à 16:50:04  profilanswer
 

nraynaud a écrit :

au fait, je vous rappelle que dans le monde normal, la vue est un listener du modèle.


Ouais, dans le monde normal ;) Le modèle y est "actif"... Par contre en web, il est "passif"... C'est le contrôlleur qui dit à une vue de s'afficher... Pas le modèle

n°1206240
Je@nb
Kindly give dime
Posté le 23-09-2005 à 20:00:14  profilanswer
 

Pour le système de template en XSLT, j'y réfléchi aussi de plus en plus, en fait tu génères un fichier XML avec tes données puis tu le passe à XSLT avec une feuille de style qui va bien pour afficher ce que tu veux ? Perso je pensais faire ainsi mais si c'est pas ça t'aurais un exemple ?

mood
Publicité
Posté le 23-09-2005 à 20:00:14  profilanswer
 

n°1206243
plainsofpa​in
Pingouino's lover
Posté le 23-09-2005 à 20:03:21  profilanswer
 

Sauf erreur, c'est bien comme ca que fait florentG il me semble.
 
BDD/PHP > XML > XSLT > Whatever si je me trompe pas.

Message cité 1 fois
Message édité par plainsofpain le 23-09-2005 à 20:03:35

---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
n°1206581
nraynaud
lol
Posté le 24-09-2005 à 18:22:24  profilanswer
 

FlorentG a écrit :

Ouais, dans le monde normal ;) Le modèle y est "actif"... Par contre en web, il est "passif"... C'est le contrôlleur qui dit à une vue de s'afficher... Pas le modèle


1) en .net (Webcontrols) ça marche aussi.
2) le contrôleur n'a rien à dire à la vue. le controleur agit sur le modèle, c'est ce dernier qui va prévenir la vue (et tous ceux qui l'observent en général) qu'il s'est modifié.

n°1206851
skeye
Posté le 25-09-2005 à 11:55:25  profilanswer
 

nraynaud a écrit :

1) en .net (Webcontrols) ça marche aussi.
2) le contrôleur n'a rien à dire à la vue. le controleur agit sur le modèle, c'est ce dernier qui va prévenir la vue (et tous ceux qui l'observent en général) qu'il s'est modifié.


 
Ca me parait plus une question d'interprétation qu'autre chose, ça, non?
La vue ne sera pas modifiée si le modèle n'est pas modifié, mais dans la pratique on est obligé de demander à la vue de réafficher dès qu'on veut faire intervenir le controleur...[:spamafote]
Par contre je suis tout à fait d'accord sur le fait que le controleur ne doit avoir aucune incidence sur ce qu'affiche la vue...


---------------
Can't buy what I want because it's free -
n°1207343
FlorentG
Unité de Masse
Posté le 26-09-2005 à 08:51:50  profilanswer
 

plainsofpain a écrit :

Sauf erreur, c'est bien comme ca que fait florentG il me semble.
 
BDD/PHP > XML > XSLT > Whatever si je me trompe pas.


Voilà :jap:
 

nraynaud a écrit :

2) le contrôleur n'a rien à dire à la vue. le controleur agit sur le modèle, c'est ce dernier qui va prévenir la vue (et tous ceux qui l'observent en général) qu'il s'est modifié.


Je voulais dire que le contrôleur instancie la bonne vue. Par contre en web, difficile pour le modèle de dire à la vue qu'il s'est modifié...

n°1207347
plainsofpa​in
Pingouino's lover
Posté le 26-09-2005 à 09:11:36  profilanswer
 

Donc logiquement, en web moi je verrais un controleur principal, qui, selon la requete du client, instancierait un controleur spécifique à l'action, qui lui même instancierait le modèle et la vue qui vont bien.
 
Parce que la notion d'observers, en web, je vois pas trop comment ce serait possible ...


Message édité par plainsofpain le 26-09-2005 à 09:12:15

---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
n°1207360
FlorentG
Unité de Masse
Posté le 26-09-2005 à 09:31:58  profilanswer
 
n°1207365
plainsofpa​in
Pingouino's lover
Posté le 26-09-2005 à 09:37:22  profilanswer
 

Assez impressionnant. Fallait y penser [:pingouino]


---------------
http://www.alsacreations.com , http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net/. Exemple à ne surtout pas suivre : www.worldinternet.be
n°1207366
FlorentG
Unité de Masse
Posté le 26-09-2005 à 09:39:08  profilanswer
 

Je t'explique pas le temps d'exécution sous PHP4 sans opcode-cache [:johneh]

n°1207367
skeye
Posté le 26-09-2005 à 09:39:22  profilanswer
 


 
 
[un peu HS]
Dans le code d'exemple, on peut lire ceci :
 

Code :
  1. function addObserver (& $observer) {
  2.         $this->observers[]=& $observer;
  3.     }


 
A l'affectation le & est encore nécéssaire? [:urd]
Puisque l'objet passé en paramètre est déjà une référence, je vois pas pourquoi... :??:
[/un peu HS]


---------------
Can't buy what I want because it's free -
n°1207368
FlorentG
Unité de Masse
Posté le 26-09-2005 à 09:40:20  profilanswer
 

Sauf que si tu fais :

$this->observers[]= $observer;


Tu mettera dans $this->observers[] une copie de $observer :( Faut des & partout :fou:

n°1207369
skeye
Posté le 26-09-2005 à 09:42:03  profilanswer
 

plainsofpain a écrit :

Assez impressionnant. Fallait y penser [:pingouino]


Bah je c'est une implémentation assez classique, non? :??:


---------------
Can't buy what I want because it's free -
n°1207370
skeye
Posté le 26-09-2005 à 09:43:01  profilanswer
 

FlorentG a écrit :

Sauf que si tu fais :

$this->observers[]= $observer;


Tu mettera dans $this->observers[] une copie de $observer :( Faut des & partout :fou:


 
 
Oui, mais une copie de la référence pointera au bon endroit, non?


---------------
Can't buy what I want because it's free -
n°1207371
Je@nb
Kindly give dime
Posté le 26-09-2005 à 09:43:55  profilanswer
 

Et pour la gestion de la base de donnée vous utilisez singleton ?

n°1207374
skeye
Posté le 26-09-2005 à 09:46:20  profilanswer
 

Je@nb a écrit :

Et pour la gestion de la base de donnée vous utilisez singleton ?


 
Pas encore, mais si j'ai le temps de m'y atteler, oui.


---------------
Can't buy what I want because it's free -
n°1207376
FlorentG
Unité de Masse
Posté le 26-09-2005 à 09:46:33  profilanswer
 

skeye a écrit :

Oui, mais une copie de la référence pointera au bon endroit, non?


ch'ais pas  [:johneh]  Faudrait tester
 

Je@nb a écrit :

Et pour la gestion de la base de donnée vous utilisez singleton ?


DAO + Singleton...

n°1207377
skeye
Posté le 26-09-2005 à 09:47:27  profilanswer
 

FlorentG a écrit :

ch'ais pas  [:johneh]  Faudrait tester


 
Bah d'après mes tests ça a l'air de marcher... :whistle:
 
[edit]
 
Mais je vais modifier quand même, dans le doute...ça évitera au moins de dupliquer la référence pour rien...[:joce]


Message édité par skeye le 26-09-2005 à 09:48:18

---------------
Can't buy what I want because it's free -
n°1207379
omega2
Posté le 26-09-2005 à 09:49:47  profilanswer
 

Au fait, c'est quoi "singleton"? une extension de php ou juste uen technique permettant d'avoir les même valeur dans tous les objets d'une classe donnée?

n°1207380
skeye
Posté le 26-09-2005 à 09:51:38  profilanswer
 

omega2 a écrit :

Au fait, c'est quoi "singleton"? une extension de php ou juste uen technique permettant d'avoir les même valeur dans tous les objets d'une classe donnée?


 
un design pattern...


---------------
Can't buy what I want because it's free -
n°1207382
FlorentG
Unité de Masse
Posté le 26-09-2005 à 09:53:14  profilanswer
 

singleton pattern (super utile ce site [:dawa], dommage qu'il a été down pendant 2 semaines)

n°1207388
omega2
Posté le 26-09-2005 à 10:02:17  profilanswer
 

ok, me rapellais plus du mot clé "static". :lol:
Ca va m'éviter de trimbaler certains objets dans tous les sens. :) Heureusement que vous me rapellez ça maintenant vu que j'ai a peine commencé la future version de mon site.

n°1207531
shakpana
des fois, j'me demande ...
Posté le 26-09-2005 à 13:30:08  profilanswer
 

> singleton pattern
je vais embrayer là-dessus si vous le voulez bien :)
 
je me demande bien, au delà du design, quel est l'impact sur les perfs de l'usage d'une classe (qui aurait besoin d'être une instance unique) soit en instance Singleton ou hors du context objet (avec stockage déporté) ...
 
pour être plus clair : est-il plus interressant "performance wise" d'instancier, par exemple, un transactionManager, auquel cas l'objet stocke ses membres, ou d'appeller direct des fonctions static, auquel cas les éventuels "membres" sont stockés en dehors du context objet (niveau global ou autre stockage) ?
 
ok c'est un peu théorique, car encore une fois c'est pas vraiment une question de design spécifique, mais plus une reflexion sur les perfs ... et finalement ça impact sur l'usabilité, car finalement je trouve plus pratique d'appeller une func. static plutôt que de trimbaler une instance (à l'intérieur des classes utilisant, par ex., notre transactionManager) ...
 
en même temps, j'ai qu'a tester me direz-vous ...

n°1207539
FlorentG
Unité de Masse
Posté le 26-09-2005 à 13:41:25  profilanswer
 

Moi j'appelle des fonctions statiques sur une classe qui trimballe une instance d'elle-même [:dawa] Donc un singleton utilisé pour un accès à une classe statique et global...

n°1207563
shakpana
des fois, j'me demande ...
Posté le 26-09-2005 à 13:57:07  profilanswer
 

pas mal, j'en ai une comme ça aussi  :D  
au début ça me semblait un peu capilotracté, mais ça a l'avantage des deux ...

n°1208785
FlorentG
Unité de Masse
Posté le 27-09-2005 à 15:55:35  profilanswer
 

Bien, après quelques jours de réflexions complètes, j'ai décidé d'abandonner quelque peu l'idée d'avoir une abstraction totale vis-à-vis de la source de données... Surtout après avoir lu un post là-dessus... Etre totalement abstrait est vraiment trop difficile, limite un peu la liberté, risque de porter atteinte aux perfs, et ne diminue le temps de développement que légèrement en cas de changement de SGBD...
 
Théoriquement, avoir une abstraction totale veut dire : on peut chercher les données à partir d'une base MySql, Oracle, SQLServer, un document XML, un fichier texte, via un socket qui utilise un protocole réseau obscure, etc.
 
Alors pour ce qui est des SGBD conventionnels (MySql, Oracle...), y'a déjà tout l'SQL qui change... Sélectionner les enregistrements 10 à 30 sous MySql ne se fait pas de la même manière sous Oracle, pas non plus sous Postgre... Pire encore, si on a un fichier XML ou CSV, y'aura même pas d'SQL du tout (XPath pour l'XML, et parsing pour le fichier texte)...
 
Après y'a aussi l'organisation des données qui changent. Imaginez une hiérarchie d'éléments. Sous un SGBD, vous pouvez utiliser une liste adjacente, donc une table qui contient des champs id, parent_idet title. Puis on reconstruit l'arbre via récursivité. Avec un fichier XML, même pas besoin de stocker l'id du parent, il suffit de stocker l'élément dans son parent. Donc niveau représentation des données, ça fait un champ qui saute...
 
Pour revenir au niveau des requêtes SQL, se pose le problème des clauses WHERE... Là aussi c'est le merdier. Pareil pour les types de champs... Certains ont des types de champs (genre Postgre qui a des types géométriques ), qui sont représentés totalements différemment chez d'autres (ici notre type Postgre 'point' devra par exemple être sous formes de deux int sous MySql). Rajoutez là-dessus la présence ou non de procédures stockées, et on s'en sort plus...
 
Bref, un merdier total, une infinité de possibilité... Faut carrément un layer supplémentaire, que je baptiserais "Data Access Logic", qui serait chargé par exemple de traduire les types de données entre PHP et la solution de stockage...
 
 
 
Donc, ce que j'ai fais, c'est définir des DAO génériques de bases, sous forme d'interface. Par exemple, j'ai un ITableDao, qui définit des méthodes pour gérer une table (enfin une liste d'éléments pour être plus précis, vu que la notion de table n'est pas présente partout), donc ajout, modification, suppression, listing, etc.
 
Après j'implémente ces DAO pour telle ou telle technologie, je me retrouve avec des MySqlTableDao, XmlTableDao, etc.
 
Pis après si y'a des impératifs spécifiques, genre sélection selon un critère ou calculs spéciaux, je définis une nouvelle interface, qui hérite de ITableDao, et qui définit les méthodes spécials. Puis pareil, je fais l'implémentation suivant les différentes technologies.
 
Exemple :
 
http://img281.imageshack.us/img281/2384/exempledao7ab.png
 
Donc en théorie, les DAO génériques devrait être tous fait (bon, ça, on verra dans le temps, pour l'instant je vais faire ceux pour MySql et fichiers XML). Après, si changement il y a, suffit de refaire les DAO spécifiques, et ça roule...
 
Qu'en pensez-vous ? [:dawa]


Message édité par FlorentG le 27-09-2005 à 15:56:01
n°1208835
souk
Tourist
Posté le 27-09-2005 à 16:19:12  profilanswer
 

les singletons c'est le maâââal [:petrus75]

n°1208840
FlorentG
Unité de Masse
Posté le 27-09-2005 à 16:22:20  profilanswer
 

Touriste :o J'ai pas de singleton là :(

n°1208948
souk
Tourist
Posté le 27-09-2005 à 17:04:58  profilanswer
 

FlorentG a écrit :

Moi j'appelle des fonctions statiques sur une classe qui trimballe une instance d'elle-même [:dawa] Donc un singleton utilisé pour un accès à une classe statique et global...


 
ah ? [:joce]

n°1208950
FlorentG
Unité de Masse
Posté le 27-09-2005 à 17:06:02  profilanswer
 

Ouais :o C'est pour la class Config... Comme ça n'importe qui a accès à la config et à ce qui l'intéresse... Mais c'est un truc auquel je dois encore réfléchir...

n°1208996
nraynaud
lol
Posté le 27-09-2005 à 17:44:57  profilanswer
 

Je rappelle au passage que découpler les données de la base, ça permet aussi de tester avec des fakes, de développer indépendament de la base pour diviser le boulot, d'injecter des données bizzares dans les tests sans se faire chier, et d'avoir un design plus modulaire (parce qu'au moins y'a pas de SQL dans le business).


---------------
trainoo.com, c'est fini
n°1209227
FlorentG
Unité de Masse
Posté le 27-09-2005 à 22:01:25  profilanswer
 

Voilà, je pense que tout le monde est d'accord de n'avoir aucun SQL dans la logique métier. Après c'est le layer en dessous qui pose problème : abstraction ultime ou non. Moi j'ai choisi quelque chose au milieu...

n°1210220
skeye
Posté le 28-09-2005 à 20:27:30  profilanswer
 

Moi j'ai du SQL dans le métier et je vous merde.[:petrus75]
Mais d'un autre coté j'aimerais bien reprendre ce code...[:joce]


Message édité par skeye le 28-09-2005 à 20:27:41

---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  62  63  64  65  66  67

Aller à :
Ajouter une réponse
 

Sujets relatifs
Comment créer une architecture propre et fonctionelle...[Débutant] Webdesigner a besoin d'aide pour PHP
script PHP style explorateur windowsPHP et MS SQL
[PHP] envoi d'images qui se dimentionne et s'ajoute direct sur 1pageAfficher le temps utilisé pour générer une page PHP
[PHP] connexion bdd différente selon page locale ou sur serveur ?Afficher une image générée par un script PHP dans un PDF ?
Utilisation d'une variable en Flash depuis PHPErreur de forum PHP
Plus de sujets relatifs à : Model View Controller (MVC) - Architecture des applications PHP


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR