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

 


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

Model View Controller (MVC) - Architecture des applications PHP

n°1479151
FlorentG
Posté le 21-11-2006 à 11:57:02  profilanswer
 

Reprise du message précédent :

masklinn a écrit :

C'est immondement mochissime [:dawa]
 
Tu es prié de ne plus jamais poster ton code ici [:dawa]


C'est normal c'est du PHP :o
 
Et c'est un cas un peu spécial, vu que cette View peut être récursive et doit d'auto-appeller :o
 
Si t'as d'autres idées :o

mood
Publicité
Posté le 21-11-2006 à 11:57:02  profilanswer
 

n°1479158
nycius
Ich liebe dich !
Posté le 21-11-2006 à 12:00:07  profilanswer
 

masklinn a écrit :

Non mais je m'en fous hein, tout ce que les templates doivent connaître ce sont les données à afficher déjà récupérées, donc elles peuvent avoir une certaine connaissance des modèles, elles peuvent recevoir des infos à côté (paramètres), mais elles ne doivent jamais avoir une quelconque vue de l'implémentation, rien dans la partie "Vue" ne doit accéder au FS ou à un moyen de stockage/persistence quelconque (SQL, cache, ...) de manière explicite


 
Donc pour toi c'est pas du template ce qui suit :
 

Code :
  1. include('template.php');
  2. $template = new Template('./');
  3. // Select a la base
  4. $sql = 'SELECT id FROM membre';
  5. $total = mysql_num_rows(mysql_query($sql));
  6. $template->set_filenames(array('test' => 'test.tpl'));
  7. $template->assign_vars(array(
  8. 'TOTAL' =>  $total,
  9. ));
  10. $template->pparse('test');

n°1479159
skeye
Posté le 21-11-2006 à 12:02:24  profilanswer
 

nycius a écrit :

Donc pour toi c'est pas du template ce qui suit :
 

Code :
  1. include('template.php');
  2. $template = new Template('./');
  3. // Select a la base
  4. $sql = 'SELECT id FROM membre';
  5. $total = mysql_num_rows(mysql_query($sql));
  6. $template->set_filenames(array('test' => 'test.tpl'));
  7. $template->assign_vars(array(
  8. 'TOTAL' =>  $total,
  9. ));
  10. $template->pparse('test');



 
non. Ca c'est un mélange de controller et de model.[:joce]


---------------
Can't buy what I want because it's free -
n°1479163
nycius
Ich liebe dich !
Posté le 21-11-2006 à 12:06:03  profilanswer
 

skeye a écrit :

non. Ca c'est un mélange de controller et de model.[:joce]


 
Alors comment tu isolerais ca ?  :jap:

n°1479164
skeye
Posté le 21-11-2006 à 12:09:45  profilanswer
 

nycius a écrit :

Alors comment tu isolerais ca ?  :jap:


tu gicles le model de là, et tu as un simili controller...[:dawao]


---------------
Can't buy what I want because it's free -
n°1479195
masklinn
í dag viðrar vel til loftárása
Posté le 21-11-2006 à 13:14:04  profilanswer
 

FlorentG a écrit :

Si t'as d'autres idées :o


J'utilise:

  • Pas PHP
  • Des moteurs de templates existants


[:dawa]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1479199
FlorentG
Posté le 21-11-2006 à 13:22:36  profilanswer
 

masklinn a écrit :

J'utilise:

  • Pas PHP
  • Des moteurs de templates existants


[:dawa]


Ben moi j'utilise PHP comme moteur de template... Là c'est juste la classe au-dessus qui se charge de sélectionner les données adéquats à partir du model, et de créer les sous-view s'il faut. Alors évidemment la gueule du constructeur est plutôt moche, mais c'est pas trop grave, les paramètres étant injectés

n°1479278
masklinn
í dag viðrar vel til loftárása
Posté le 21-11-2006 à 14:34:22  profilanswer
 

nycius a écrit :

Donc pour toi c'est pas du template ce qui suit :
 

Code :
  1. include('template.php');
  2. $template = new Template('./');
  3. // Select a la base
  4. $sql = 'SELECT id FROM membre';
  5. $total = mysql_num_rows(mysql_query($sql));
  6. $template->set_filenames(array('test' => 'test.tpl'));
  7. $template->assign_vars(array(
  8. 'TOTAL' =>  $total,
  9. ));
  10. $template->pparse('test');



non

nycius a écrit :

Alors comment tu isolerais ca ?  :jap:


Toute la partie SQL devrait être déplacée dans un objet modèle, et ce fichier devient plus ou moins un contrôleur qui s'occupe

  • De recevoir et dispatcher les requêtes
  • D'instancier les modèles et de leur transmettre les données reçues via les requêtes
  • De transférer les objets modèles au(x) template(s)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1479287
nycius
Ich liebe dich !
Posté le 21-11-2006 à 14:40:25  profilanswer
 

masklinn a écrit :

non
 
Toute la partie SQL devrait être déplacée dans un objet modèle, et ce fichier devient plus ou moins un contrôleur qui s'occupe

  • De recevoir et dispatcher les requêtes
  • D'instancier les modèles et de leur transmettre les données reçues via les requêtes
  • De transférer les objets modèles au(x) template(s)


Ca t'embeterais de prendre mon exemple et de l'adapter selon ton exemple ?

n°1479298
FlorentG
Posté le 21-11-2006 à 14:51:03  profilanswer
 

nycius a écrit :

Ca t'embeterais de prendre mon exemple et de l'adapter selon ton exemple ?


Lis le tout premier post du topic, ça te donnera une idée. D'ailleurs je vais le refaire un peu un jour

mood
Publicité
Posté le 21-11-2006 à 14:51:03  profilanswer
 

n°1479331
nycius
Ich liebe dich !
Posté le 21-11-2006 à 15:33:37  profilanswer
 

FlorentG a écrit :

Lis le tout premier post du topic, ça te donnera une idée. D'ailleurs je vais le refaire un peu un jour


 
Si tu pouvais refaire ton 1er post en incluant un systeme template ce serait bien

n°1479344
FlorentG
Posté le 21-11-2006 à 15:46:16  profilanswer
 

Ben y'a un système de template [:dawak] A l'arrache, mais y'en a un ;)

n°1479366
nycius
Ich liebe dich !
Posté le 21-11-2006 à 15:56:31  profilanswer
 

et ca ?
 

Code :
  1. class UserModel {
  2.   function get_user($user_id,$value) {
  3.    
  4.     return mysql_fetch_assoc(mysql_query("SELECT $value FROM user WHERE user_id = $user_id" ));
  5.   }
  6. }


Code :
  1. include('template.php');
  2. $template = new Template('./');
  3. $model = new UserModel();
  4. $template->set_filenames(array('test' => 'test.tpl'));
  5. $template->assign_vars(array(
  6. 'NOM' =>  $model->get_user(1544,'nom'); ,
  7. ));
  8. $template->pparse('test');


Message édité par nycius le 21-11-2006 à 15:56:53
n°1479367
FlorentG
Posté le 21-11-2006 à 15:57:29  profilanswer
 

C'est un peu mieux. Maintenant le get_user devrait se faire dans une classe séparée qui appellerait ensuite la template en elle-même

n°1479368
nycius
Ich liebe dich !
Posté le 21-11-2006 à 15:58:10  profilanswer
 

FlorentG a écrit :

C'est un peu mieux. Maintenant le get_user devrait se faire dans une classe séparée qui appellerait ensuite la template en elle-même


 
 :heink:

n°1479461
c0wb0y
:d
Posté le 21-11-2006 à 17:12:40  profilanswer
 

Code :
  1. class FooController {
  2.     function barAction(){
  3.         $model = get_user();
  4.         $view = new UserView($model);
  5.         $view->render()
  6.     }
  7. }
 

C'est un truc de ce genre je pense dont parle FlorentG.


Message édité par c0wb0y le 21-11-2006 à 17:15:34
n°1479466
nycius
Ich liebe dich !
Posté le 21-11-2006 à 17:33:31  profilanswer
 

FlorentG a écrit :

C'est un peu mieux. Maintenant le get_user devrait se faire dans une classe séparée qui appellerait ensuite la template en elle-même


 
Tu pourrais détailler ? je vois pas trop la

n°1479476
FlorentG
Posté le 21-11-2006 à 17:44:59  profilanswer
 

Bien, re-exemple complet. Certains trucs devraient évidemment être implémentés differemment (genre la connection à la base, qui n'a évidemment rien à foutre dans getUser), mais c'est pour le principe :
 
Model

Code :
  1. class model_user
  2. {
  3.   public function getUser($id)
  4.   {
  5.      mysql_connect('localhost', 'pouet', 'tagada');
  6.      $result = mysql_query('SELECT * FROM user WHERE id = ' . (int)$id);
  7.      return mysql_fetch_array($result);
  8.   }
  9. }


 
Ensuite vient le Controller, qui va instancier le model et le filer à la view :
 

Code :
  1. class controller_user
  2. {
  3.   public function get()
  4.   {
  5.     $model = new model_user();
  6.     return new view_user($model, $_GET['id']);
  7.   }
  8. }


 
La view, composée d'une classe et d'une template :

Code :
  1. class view_user
  2. {
  3.   public function __construct($model, $userId)
  4.   {
  5.     $this->data['user'] = $model->getUser($userId);
  6.  
  7.      require('user.template.php');
  8.   }
  9. }


 
Et enfin la template

Code :
  1. <div class="user">
  2.   <span class="name"><?php echo $this->data['user']['name'] ?></span>
  3.   <span class="id"><?php echo $this->data['user']['id'] ?></span>
  4. </div>


Message édité par FlorentG le 21-11-2006 à 17:45:28
n°1479483
tabouret e​n bois
Profil:s de pute
Posté le 21-11-2006 à 17:48:56  profilanswer
 

cool [:drapo]


---------------
██████████████████████████████████
n°1479507
masklinn
í dag viðrar vel til loftárása
Posté le 21-11-2006 à 18:24:41  profilanswer
 

Chuis pas d'accord avec la partie template (et une partie des fonctionalités du contrôlleur) [:dawa]
 
Le modèle user devrait être une simple classe User, avec un truc genre find ou findUser en méthode statique, qui prend un ID et renvoie un objet User, et le template ne devrait pas avoir besoin d'aller chercher lui même le user, toutes les données devraient lui être fournies point barre.
 
Donc on aurait un truc du style:
 
user_controller

Code :
  1. class user_controller {
  2.     // le dispatching est fait plus haut dans l'application, un contrôlleur n'a pas à se taper les $_GET ou $_POST
  3.     public function GET($id) {
  4.       $user= User::find_by_id($id);
  5.    
  6.       return new user_view($user);
  7.     }
  8. }


 
user_view:

Code :
  1. class user_view {
  2.    public function __construct($user) {
  3.        require('user.template.php');
  4.    }
  5. }


user.template.php:

Code :
  1. <div class="user">
  2.    <span class="name"><?php echo $user->name ?></span>
  3.    <span class="id"><?php echo $user->id ?></span>
  4. </div>

Message cité 1 fois
Message édité par masklinn le 21-11-2006 à 18:26:55

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1479529
FlorentG
Posté le 21-11-2006 à 19:17:38  profilanswer
 

masklinn a écrit :

Le modèle user devrait être une simple classe User, avec un truc genre find ou findUser en méthode statique, qui prend un ID et renvoie un objet User


Tout dépend de la DP que tu veux : Domain, Active Record, DataTable, etc.
 

masklinn a écrit :

et le template ne devrait pas avoir besoin d'aller chercher lui même le user, toutes les données devraient lui être fournies point barre.


Ca dépend de quoi... Parfois je préfère juste filer le model, et la view se démerde avec. Le Controller fourni un model et quelques infos, et après on peut switcher la view comme on veut.
 
Exemple réel dans mon framework, j'ai un Controller Diaporama qui met à disposition un model Diaporama. Ensuite j'ai fait plusieurs View : une qui affiche photo par photo, une autre qui affiche la listes des photos avec celle en cours en grand au-dessus. Y'en a une qui a besoin d'une seule photo, l'autre qui a besoin de la liste complète. Ce serait dommage de devoir refaire un deuxième Controller (ou une deuxième action) juste pour supporter la view.
 
Alors je créé un model, j'le met à disposition. Ensuite dans le fichier de config j'indique la view (photo par photo ou liste), et le framework s'occupe de lier controller et view. Et comme dit, le Controller reste le même quelque soit la view...

n°1479675
_synapse_
Posté le 22-11-2006 à 01:07:20  profilanswer
 

Ca semble tellement logique et clair comme concept que personne n'arrive à se comprendre ou expliquer clairement les choses  :pt1cable:  
 
Pas mal pour une méthode censée simplifier, c'est un peu comme le concept de "l'extreme programming" non ?  :D

n°1479726
FlorentG
Posté le 22-11-2006 à 09:30:13  profilanswer
 

J'explique pas assez clairement ? :cry:

n°1479808
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2006 à 11:28:22  profilanswer
 

En surfant HFR, je suis tombé sur un topic qui citait cet article : http://tahe.developpez.com/web/php/mvc/
 
Je l'ai mis en oeuvre dans une application qu'on m'a demandé de faire récemment en PHP. Je trouve que la structure est pas mal.
 
Tout d'abord, on a un fichier de conf qui stocke :
- les associations entre les noms des actions et les scripts php contenant les actions a effectuer (1 script php par action),
- les associations entre les noms des états et les scripts php contenant les états ainsi que les actions autorisées à être executées à partir d'un état,
- les associations entre les modèles de vues et les scripts php chargés d'effectuer le rendu d'une vue,
- les associations entre les noms des vues et les templates à utiliser par le modèle de vue (ici, Smarty),
- les associations entre les noms d'actions et les droits d'accès (ça, c'est pas dans l'article, c'est de moi).
 
Ensuite, on a le contrôleur (index.php) qui :
- desserialise les variables de session,
- reçoit le nom de l'action à executer,
- vérifie que l'enchaînement d'action est autorisé,
- vérifie que l'utilisateur a le droit d'executer l'ation,
- appel le script php d'action pour l'exécuter,
- appel le script php d'état spécifié par le script d'action.
 
Le script d'action exécuté fait ce qu'il a à faire :
- analyse les paramètres passés en entrée (formulaires ou autre),
- utilise les objets pour manipuler la BD,
- stocke les erreurs rencontrées,
- spcécifie le script php d'état et la vue à afficher pour la réponse.
 
Le script d'état :
- charge les traductions dont la vue a besoin,
- indique les JavaScripts et feuilles de styles dont la vue a besoin,
- refait un peu de mise en forme si nécessaire de certains données (notamment les objets) pour qu'elles soient exploitables par le moteur de template,
- charge dans des "buffers" les données dynamiques (ce qui a été calculé par le script d'action),
- demande de serialiser la session.
 
Le script de modèle de vue :  
- initie Smarty,
- réalise les affectations entre les variables du template et les traductions/données/Javascripts/CSS,
- appel le template et affiche le rendu.

n°1479811
Djebel1
Nul professionnel
Posté le 22-11-2006 à 11:32:22  profilanswer
 

A mon sens, la vue ne fait que récupérer des infos du model, elle ne lui en donne pas.
(alors que toi tu fais :
$this->data['user'] = $model->getUser($userId);
dans la vue, la vue donne donc le paramètre $userId au model)
 
Pour moi, le controller doit passer le $_GET['id'] au model, passer le model à la vue, et la vue récupérer les infos du model ; bref, la vue ne lui en donne pas.

n°1479816
FlorentG
Posté le 22-11-2006 à 11:47:19  profilanswer
 

rufo a écrit :

En surfant HFR, je suis tombé sur un topic qui citait cet article : http://tahe.developpez.com/web/php/mvc/


Je suis en train de survoler là, ça m'a l'air assez bordélique, et pas beaucoup automatisé :(

n°1479825
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2006 à 11:56:37  profilanswer
 

FlorentG a écrit :

Je suis en train de survoler là, ça m'a l'air assez bordélique, et pas beaucoup automatisé :(


 
qu'est ce que tu entends par "automatisé"? L'idée principale, c'est que l'application est vue comme un automate à états finis.

n°1479827
FlorentG
Posté le 22-11-2006 à 11:57:36  profilanswer
 

Vu la gueule de la config :D
 
 
Enfin ch'ais pas... Ou alors c'est developpez.com, chaque fois que je lis un article sur ce site, soit c'est n'importe quoi, soit y'a chaque fois des erreurs :(

n°1479834
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2006 à 12:05:11  profilanswer
 

le fichier de config est effectivement à rédiger manuellement. L'avantage que j'y vois est qu'on ne risque pas de voir son appli se retrouver dans un été non prévu. En plus, si on a modélisé dans les specs l'enchaînement des pages via un graphe, ça correspond bien à la structure du fichier de config : les états+vues sont les sommets, arêtes sont les actions...

n°1479836
FlorentG
Posté le 22-11-2006 à 12:06:31  profilanswer
 

Le truc c'est qu'on peut automatiser tout ça...

n°1479906
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2006 à 14:03:59  profilanswer
 

FlorentG a écrit :

Le truc c'est qu'on peut automatiser tout ça...


si on utilise un outil pour modéliser le graphe de l'appli, effectivement, ça pourrait générer le fichier de conf automatiquement.
 
l'avantage aussi du fichier de conf, c'est que ça évite d'avoir un gros switch dans le contrôleur sur l'action a effectuer...là, directement, la bonne action est exécutée ;)

n°1479908
FlorentG
Posté le 22-11-2006 à 14:05:06  profilanswer
 

Moi j'ai pas de switch, tu spécifies l'action que tu veux, si elle existe elle est exécutée, et si elle existe pas ça part vers l'action par défaut...

n°1479943
rufo
Pas me confondre avec Lycos!
Posté le 22-11-2006 à 14:37:52  profilanswer
 

ben dans le contrôleur mis en exemple sur la première page, y'a un switch.

n°1481761
vanadium
N° Atomique : 23
Posté le 25-11-2006 à 20:09:59  profilanswer
 

Je pense que si l'on veut faire quelque chose de propre en MVC, mieux vaut s'inspirer d'un projet open source mature qui utilise ce genre d'architecture. On peut par exemple prendre Xoops comme modèle.

n°1481831
FlorentG
Posté le 26-11-2006 à 10:53:12  profilanswer
 

rufo a écrit :

ben dans le contrôleur mis en exemple sur la première page, y'a un switch.


Ouais, c'est mis en exemple :D après de mon côté j'ai fait différemment, c'était un peu pour illustrer... Je vais d'ailleurs une fois mettre à jour l'exemple

n°1481832
FlorentG
Posté le 26-11-2006 à 10:54:08  profilanswer
 

vanadium a écrit :

Je pense que si l'on veut faire quelque chose de propre en MVC, mieux vaut s'inspirer d'un projet open source mature qui utilise ce genre d'architecture. On peut par exemple prendre Xoops comme modèle.


Ouais, j'ai pas mal étudié des trucs genre CakePHP, CodeIgniter ou le ZendFramework. J'ai des trucs qui ressemblent beaucoup, d'autres moins. J'me suis aussi pas mal baladé sur le forum de sitepoint, où plein de gens discutent de ce même sujet

n°1488317
nORKy
Grmmph...
Posté le 07-12-2006 à 22:13:56  profilanswer
 

Bonjour
 
Comment faites vous pour integrer des sessions utilisateurs avec droits dans un model MVC ?
Exemple connu, l'administration de news.
Prenom une action listeNews
Un utilisateur classique vois la liste des news alors qu'un utilisateur connecté peut avoir ou non X droits (comme editer, modifier, supprimer) sur cette même vue.
Comment intégrer cela ?
Ma vue listNews contient les liens (comme édition), mais ils s'afficheront en fonctionne de certaines variables qui seront passé par le model listNews donc.
Mon model News biensur est la pour gérer les news, mais comment marche la liaison, avec, premierement, les sessions, et deuxièment avec le model utilisateur ?
 
Qui crée le model utilisateur qui représente l'utilsateur connecté ? le controlleur ? ou est stocké ce model ? car, n'importe qu'elle action peut en avoir besoin...

n°1488426
gizmo
Posté le 08-12-2006 à 10:36:55  profilanswer
 

C'est le controlleur (ou plutot le FrontController s'il y en a un) qui gere les utilisateurs et les actions qui leurs sont autorisees.

n°1488432
rufo
Pas me confondre avec Lycos!
Posté le 08-12-2006 à 10:45:55  profilanswer
 

gizmo a écrit :

C'est le controlleur (ou plutot le FrontController s'il y en a un) qui gere les utilisateurs et les actions qui leurs sont autorisees.


 
C'est à ce niveau là que j'ai mis aussi cette gestion. Ca me apraît le plus logique et le plus centralisé...

n°1488448
nORKy
Grmmph...
Posté le 08-12-2006 à 11:17:28  profilanswer
 

Désolé, mais j'ai du mal à vous suivre.
Donc, en admettant que le front controlleur lis des variables de session de l'utilisateur, crée le model qui va avec, comment il le passe à l'action demandé ? Ou alors, c'est l'action qui demande au front controlleur l'utilisateur connecté et qui donc peut déterminer bon liens de la vue ?
 
Autre chose, en admettant toujours cela, c'est donc, le front controlleur trouve une action non autorisé, il va donc être obligé de chargé une vue spécial dites 'opération refusée' ? J'ai l'impression qu'on s'éloigne du model MVC car, on a un front controller qui fait tout
 
Je veux bien que le front controlleur concerve un model utilisateur et que les actions lui demande, mais après, j'aurais tendance à dire que ce sont les actions qui gère et décide de renvoyé la bonne vue. D'ailleurs, les actions peuvent-elles tous être capable de renvoyé une meme vue ? (genre une vue "opération refusée" ) ?

n°1488452
rufo
Pas me confondre avec Lycos!
Posté le 08-12-2006 à 11:22:36  profilanswer
 

Selon moi, le contrôleur intercepte les actions demandées par l'utilisateur. Si celui-ci n'a pas les droits, le contrôleur, qui normalement aurait dû appeler l'action demandée, peut très bien en appeler une autre : "action refusée". Cette action renvoie donc une vue qui affiche, par ex, un message d'erreur.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  13  14  15  ..  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-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)