IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

principe de fonctionnement du MVC


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut principe de fonctionnement du MVC
    Bonjour,

    je dispose d'un code basé sur le MVC (issu d'une personne très calée), mais j'ai des problèmes basiques de compréhension : j'ai 3 classes "model", "view" et "controller", un index.php qui crée un objet "controller" et dans le constructeur de celui-ci la création de 2 objets "view" et "model".

    Pour plus de clarté, voici le code de la classe "controller" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?php
    session_start();
    class controller{
    private $model; // 2 attributs pour pointer sur les 2 autres classes.
    private $view;
     
    public function __construct() {
     
    /* création du modèle et de la vue ; la vue doit connaître aussi le modèle */
    $this->model=new model();
    $this->view=new view($this->model);
     
    /* l'action est positionnée soit par GET (see_doc), soit par POST (formulaires) */
    $action="";
    if (isset($_GET['action'])) $action=$_GET['action'];
    if (isset($_POST['action'])) $action=$_POST['action'];
    if (!isset($_SESSION['Account'])) $action="connect"; // Si pas connecté, l'action est forcée à "connect"
    $res_updateM=$this->updateModel($action);
    $this->showView($action,$res_updateM);
     
    }
     
    public function updateModel($action) {
    switch($action) {
    	case "insert":$res=$this->model->insertOperation(new Operation($_POST['DateISO'],$_POST['intitule'],$_POST['montant'],NULL,$_POST['id']));break;
    	case "remove" : $res=$this->model->removeOperation(array_keys($_POST['suppr'])) ; break;
    	case "update": $res=$this->model->updateOperation(new Operation($_POST['DateISO'],$_POST['intitule'],$_POST['montant'],NULL,$_POST['id']));break;
    	case "connect" : $res=(isset($_POST['login']))&&($this->model->actionFormConnect($_POST['login'],$_POST['pwd'])); break;
    	default : $res=true; break;
    }
    return($res); // true si OK, false sinon
    }
     
    public function showView($action, $res_updateM) {
    switch($action) {
      case "see_doc" : $vue="doc"; break;
      case "insert" : 
      case "update" :
      case "remove" : if ($res_updateM) $vue="list"; else $vue="err"; break;
      case "connect" : if ($res_updateM) $vue="list"; else $vue="authentif"; break;
      default :$vue="list"; break;
    }
    $this->view->show($vue); // affichage des différentes vues (formulaires ou msg d'erreur)
     
    }
    }
    Les 3 classes disposent chacune de plusieurs méthodes. Celles de "view" et "model" sont appelées par les 2 de la classe "controller", ces deux-là étant lancées par le constructeur du "controller", qui est appelé par index.php : $c=new controller();.
    Visiblement les méthodes de "view" et de "model" sont tout le temps disponibles pour l'utilisateur et ce que je ne comprends pas, c'est que ces méthodes ne sont appelées qu'une seule fois, à la création du controller : peut-on m'expliquer ?

  2. #2
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    suit la trace du code.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Dans ce code, tout se passe à la création du contrôleur.
    NB : en PHP (sauf session, serialisation, etc.), toute la structure des objets est recréé à chaque fois, donc la création du contrôleur a lieue à chaque fois, à chaque clic du visiteur.

  4. #4
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    dans updateModel(), des méthodes sont bien invoquées.
    Regarde aussi les constructeur de view et model, il peut y avoir du code.

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    En fait, quand lundi soir, j'ai vu les réponses, je n'avais pas du tout imaginé que askiwhale était tout simplement l'auteur du code (je ne l'ai compris que mardi après-midi...) !

    Pour vérifier que c'était vrai, j'ai rajouté ce code dans le constructeur du controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!isset($_SESSION['appel_ctrl'])) $_SESSION['appel_ctrl']=1; else $_SESSION['appel_ctrl']++;
    et celui-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<br/><br/>nb appel ctrl:".$_SESSION['appel_ctrl']
    dans la vue principale...et c'est vrai !

    Mais que faut-il comprendre par :
    toute la structure des objets est recréé à chaque fois
    car $c=new controller(); n'est appelé qu'une seule fois, me semble-t-il...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    $c=new controller(); est appelé dans index.php.
    Ce dernier est appelé à chaque fois (à chaque action de l'utilisateur, à chaque requête HTTP).
    Donc le contrôleur (et tous ses objets agrégés) est recréé à chaque fois.
    C'est nécessaire, en PHP, sauf à mettre en SESSION (ce qui n'a pas d'intéret ici), ou autre stockage de données, tout est perdu.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Ce dernier est appelé à chaque fois (à chaque action de l'utilisateur, à chaque requête HTTP).
    Je débarque : dans tous les cas, index.php (ou index.html) est appelé à chaque action utilisateur ? (merci de l'aide askiwhale)

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,

    à chaque fois que tu visite la page index.php tu fait une requête HTTP au serveur,

    ce serveur va interpréter le code de la page que tu lui demande (donc index.php dans ton cas),

    il va lire l'instruction $c=new controller();,

    donc il va créer un nouvel objet de type controller en appelant son constructeur et donc faire appel au différente méthode appelé dans son constructeur,

    et ceci à chaque requête demandant la page index.php.

    Donc si une action ne fait pas appel à la page index.php (par exemple l'envoi d'un formulaire à la page traitement.php) alors ce code ne sera pas utilisé car non l'utilisateur ne l'a pas demandée.

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Je suis un peu perdu ; je vais donc décrire un exemple et poser mes questions.

    D'abord, l'action de l'utilisateur sera vue par une vue ; exemple d'action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <input type="button" onclick="document.getElementById('idDateFR').value='<?php echo date("d/m/Y",strtotime($op->date)); ?>';
    	document.getElementById('intitule').value='<?php echo $op->intitule; ?>';	document.getElementById('montant').value=<?php echo $op->montant;?>;
    	document.getElementById('id').value='<?php echo $op->id; ?>';	document.getElementById('action').value='update'" value="Modifier"/>
    avec plus loin :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="hidden" name="action" id="action" value="insert">
    donc le bouton "modifier" va positionner (si on clique dessus) $_POST['action'] (à "update") (le formulaire est de méthode POST) ; l'action du formulaire :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <form method="post" action="?">
    Cela veut dire que c'est le fichier courant ; or cette vue est includée dans le fichier de la classe "view" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function show($name) {
    	ob_start();
     
    	require("template/".$name.".phtml");
    	$content=ob_get_clean();
    	ob_end_clean();
    	require("template/layout.phtml");
    }
    et cette méthode est appelée dans le constructeur du contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private $view;
     
    public function __construct() {
     
    /* création du modèle et de la vue ; la vue doit connaître aussi le modèle */
    $this->model=new model();
    $this->view=new view($this->model);
    ...
    if (isset($_POST['action'])) $action=$_POST['action'];
    ...
    $res_updateM=$this->updateModel($action);
    $this->showView($action,$res_updateM);
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function showView($action, $res_updateM) {
    switch($action) {
    ...
      case "insert" : 
      case "update" :
      case "remove" : if ($res_updateM) $vue="list"; else $vue="err"; break;
      case "connect" : if ($res_updateM) $vue="list"; else $vue="authentif"; break;
      default :$vue="list"; break;
    }
    $this->view->show($vue); // affichage des différentes vues (formulaires ou msg d'erreur)
     
    }
    J'en déduis que le fichier courant est celui de la classe du contrôleur : c'est bien ça ? Et l'action "update" n'est exécutée que dans le constructeur du contrôleur, donc n'est appelée que si on appelle "index.php", donc pas souvent. Il y a visiblement un truc qui m'échappe mais quoi ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    index.php est appelé à chaque fois.

    dans cet exemple, il s'agit d'un envoi de formulaire. Donc c'est l'attribut "action" du formulaire qui compte. Il est sous cette forme action="?", ce qui signifie en fait (avec Apache configuré comme souvent) action="index.php?".

    Cela signifie bien "le fichier courant", ou plutôt l'URL courante telle que connue par le navigateur (et non le fichier PHP dont le code contient la ligne qui l'affiche). Or l'URL actuelle est elle-même ....index.php. Le navigateur ne connait même pas d'autre URL, il ne voit qu'index.php.

  11. #11
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Entendu, donc ici, les objets M,V et C ne sont jamais les mêmes ?

    Autre question : j'envisage, en conservant cette architecture, de créer un autre site web "standard" (un menu et pour chq rubrique du menu, une page qui est soi un simple affichage (qui éventuellement interroger une bdd), soi un affichage permettant une action (par exemple : un formulaire de contact, où l'action est l'envoi du mail)) ; le MVC conviendrait-il ? Et comment isoler le menu afin de le faire une seule fois plutôt que le dupliquer partout ? (include PHP ?)

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Oui, cela convient.
    Si jamais il y a beaucoup d'action (50 ou +), il faudra bien les organiser, voir ajouter du code (par exemple déléguer à des contrôleurs additionnels)

    Le menu devrait faire partie de la vue. Dans la template principale, ou dans une fonction de la classe de Vue.

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Comme je ne suis pas sûr de faire les choses correctement, je ferai un petit essai et vous le soumettrai. (Quand j'en trouverai le temps !)

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Comme les serveurs de mon entreprise (Schneider) n'exécutent pas le PHP, comment faire pour transposer ça en javascript ? Je crois que c'est possible...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Il n'y a alors plus de langage serveur, de code exécuté sur le serveur. Dans le principe, c'est possible, mais ce n'est alors plus une application client/serveur.
    Par exemple, il ne peut plus y avoir de base de données commune, ou autres éléments qui ne seraient pas propres à chaque utilisateur.

  16. #16
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Oui, il est clair qu'on est limité, notamment pour stocker des infos (à mettre en partage), donc si c'est le cas, je continuerai à mettre ça sur des hébergements perso (si ce n'est pas confidentiel...).

  17. #17
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Comme je ne suis pas sûr de faire les choses correctement, je ferai un petit essai et vous le soumettrai.
    C'est plus difficile que je ne l'imaginais, donc si on peut me proposer un exemple de petit site basé sur le MVC, je suis preneur.

  18. #18
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Essaie avec Cobalt.

    Les logiques de routage et de contrôle sont exprimées dans le même script (le front-controller):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    require_once "cobalt.php";
     
    Cobalt::setup();
     
    Cobalt::register('database', function () {
        $pdo = new PDO('...');
        return $pdo; 
    });
     
    Cobalt::register('view', function () {
        return new View;
    });
     
    Cobalt::bind('/', function ($view) {
        return $view('partials/summary.php');
    });
     
    Cobalt::bind('/articles', function ($view, $database) {
        $articles = $database->query('SELECT title,body FROM articles ORDER BY date DESC LIMIT 20');
        $articles->setFetchMode(PDO::FETCH_OBJ);
        return $view('partials/articles.php', compact('articles'));
    });
     
    Cobalt::bind('/article/:id', function ($view, $http, $database) {
        $stmt = $database->prepare('SELECT title,body FROM articles WHERE id=:id');
        if ($stmt->execute(array('id' => $http('get:id'))))
            $article = $stmt->fetch(PDO::FETCH_OBJ);
        return $view('partials/article.php', compact('article'));
    });
     
    // ... autre contrôleurs
     
    Cobalt::handle('get:url');
    C'est l'implémentation la plus simple du patron MVC que j'ai fait jusqu'a ce jour (elle est fortement inspirée de la philosophie de AngularJS par ailleurs). Si tu as besoin de détails sur le fonctionnement de Cobalt, n'hésite pas à revenir vers moi.

  19. #19
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Merci de ta réponse ; comme je fonctionne beaucoup en m'appuyant sur des exemples (c'est comme ça que j'apprends le mieux), aurais-tu un exemple (simple) d'implémentation de cobalt ? (et comme c'est du PHP, j'ai aussi besoin que tu me donnes le code).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. principe de fonctionnement : votre avis svp
    Par FraK dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2007, 12h19
  2. Principe de fonctionnement JSP/Mysql
    Par fabou3377 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 28/03/2007, 12h29
  3. onSubmit principe de fonctionnement
    Par Tempotpo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2006, 15h08
  4. [VB6] principe de fonctionnement des concepteurs ?
    Par marsup54 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 02/06/2006, 17h37
  5. [HARDWARE] Principe de fonctionnement d'un touchpad
    Par Cyspak dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 26/12/2003, 01h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo