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 :

compréhension objet/MVC et conventions


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut compréhension objet/MVC et conventions
    Bonjour,

    je voudrais coder en PHP 5 orienté objet, sur le modèle MVC, sans framework

    j'ai déjà lu quelques tutos/posts sur le sujet, mais ça reste assez flou,
    je me suis fait quelques idées, est-ce que vous pourriez me confirmer/corriger svp ?



    1) Structurer les dossier/fichiers du site :

    concrètement un site c'est plein de fichiers et dossiers, le tout dans un dossier global
    j'ai cru comprendre qu'il faudrait que j'utilise ce genre de shéma ? (pour respecter le model MVC)
    mon_dossier_global, qui contiendrait les 4 dossiers suivant :
    dossier_models ------> plein de fichiers
    dossier_view --------> plein de fichiers
    dossier_controllers --> plein de fichiers
    dossier_scripts ------> plein de fichiers (pour les scripts javascript)
    fichier_index.php



    2) Une seule classe par fichier, et une classe doit s'écrire dans un fichier du dossier "models" ?



    3) toujours par respect des conventions, un fichier dans lequel on a écrit la classe "Membre" doit se nommer : "membre.class.php" ?
    (membre devrait prendre une majuscule ? ou devrait-on le mettre au pluriel ? ou les 2...)

    et qu'en est-il des fichiers qui correspondent aux vues, et aux controllers ? Comment doit-on les nommer ?
    Et les dossiers, on doit les mettre au pluriel ?





    4) je pense avoir bien "visualisé" schématiquement ce que doit contenir un model, et une vue, mais pas trop le controller...

    model (plutot du code PHP 5)
    class Membre {
    // attributs
    // constructeurs
    // getters/setters
    // méthodes
    }

    vue : (plutot du code HTML)
    <div>
    <form>
    ...
    </form>

    <div>
    ...
    </div>
    </div>


    controller : ?
    plutôt du code PHP 5 ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    la réponse n'est pas simple dans la mesure où il n'y a pas vraiment de règle stricte dans l'organisation de tes fichiers afin de respecter le MVC. Le MVC est une approche abstraite de décomposition d'une application afin de la rendre modulable et plus facilement maintenable (diviser pour mieux règner).
    Après la manière d'organiser tes fichiers peut t'être personnelle du moment que les grands principes de séparations du MVC sont bien respectés.
    Personnellement, je m'organise différemment : j'ai arrêté avec les répertoires gigantesques comme controllers, views... dans lesquels tu retrouves 2 ou 300 fichiers.
    Je divise par concept manipulé. Par exemple pour la gestion d'un utilisateur cela donne :
    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
    User
      |-Acl (Access Control List)
      |-Controller
          Create.php
          CreateSubmit.php
          Delete.php
          DeleteSubmit.php
          Index.php
          Update.php 
          ... 
      |-Data
      |-Routing
          Router.php
      |-View
          Index.php
          Index.html.php
          InputForm.php
          InputForm.html.php
          ...
      User.php
    Sans compter qu'à chaque répertoire correspond un namespace (pour l'autoloading, c'est la classe...)

    Ce qu'il faut absolument respecter :
    - un fichier par classe
    - les classes commencent toujours par une majuscule (et le nom du fichier aussi)
    - après je ne suis pas pour le .class.php parce que quand tu décides de programmer avec la POO, tu vas créer principalement des classes un peu partout, donc ce qui est utile dans ce cas c'est d'identifier en un coup d'oeil la rareté ou ce qui s'éloigne d'une classe comme par exemple le code html d'une vue : index.html.php et pas 99% de tes fichiers qui seront toujours .class.php.
    - Jamais de pluriel, sauf pour les collections

    Pour le controller on va procéder par analogie :
    c'est équivalent à un contrôleur aérien dans une tour de contrôle.
    Code text : 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
         AERIEN                                                 WEB
    avion en approche                                       requête en approche via une URL (http://...)
        |                                                       |
    prise en charge par la tour de contrôle                 prise en charge par le point d'entrée de l'application (index.php)
        |                                                       |
    identification de l'appareil                            première analyse de la requête URL par le front controller (ce qui est demandé)
        |                                                       |
    le contrôleur aérien affecté (par exemple)              le front controller à trouvé le controller rattaché
    à tous les vols en provenance d'une                     à la requête et lui délègue la prise en charge afin
    région du monde est tenu de prendre en                  que ce dernier lui fournisse une réponse appropriée
    charge ce vol                                               |
        |                                                       |
    le contrôleur aérien se charge du guidage               le controller traite individuellement la requête : en fonction de l'analyse
    et s'occupe de l'appareil jusqu'à ce qu'il              plus fine des paramètres de cette dernière (et de leur validité), 
    soit au parking                                         il sait quoi faire et appelle les différents composants de l'application
        |                                                   afin de construire une réponse
        |                                                       |
    l'avion est au parking, le contrôleur est               le contenu de la réponse est construit
    déchargé de la prise en charge et c'est                 le contrôleur peut soit renvoyer la réponse soit
    d'autres métiers qui prennent le relais                 se décharger de cette tâche et appeller un objet dédié
        |                                                   qui avant d'envoyer la réponse enverra au préalable les bons en-têtes
        |                                                       |
    traitement terminé, le contrôleur peut                  traitement terminé, le serveur est de nouveau disponible
    prendre en charge d'autre appareils                     pour prendre en charge d'autres requêtes
    Voilà, moi et mes analogies à 2 sous

    J'espère au moins avoir éclairé ta lanterne.

  3. #3
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    oui le brouillard se disperse pas mal, ça va beaucoup mieux

    un grand merci

  4. #4
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    Mince j'avais mis le sujet en résolu pensant avoir pigé le truc mais finalement toujours pas...

    j'essaie de lire des tutos mais c'est toujours : "on utilise les un modèle pour gérer la base de données, un controller pour faire les "calculs", et une vue qui affiche le tout...

    J'aimerai poser un exemple concret pour avoir un vrai exemple non-théorique...

    l'idée c'est de simplifier le truc au maximum, pas besoin de coder les fonctions, ce que je veux c'est savoir dans quelle page les écrire, et quelles pages elles vont "appeler".

    Ici, on va dire qu'on a les membres (issuent de la class "Membre") du site enregistrés dans la base de données, et on veut afficher la liste de ces membres dans la page d'accueil.
    (c'est nul hein, mais c'est juste pour l'exemple...)

    Pour que vous compreniez mon problème, je vais vous montrer sur quoi je suis partit... Et donc là où je bloque :

    niveau fichiers, je me suis organisé de cette manière :
    à la racine j'ai 3 dossiers, et 3 fichiers :

    racine
    |
    dossier_controllers --> membre.php
    dossier_models --> Membre.php
    dossier_vues --> _acceuil.php et _membre.php
    functions.php
    index.php
    stylesheet.css

    (pour moi un fichier qui commence par un underscore c'est une vue, et si ça commence par une majuscule c'est un modèle)


    je met mes fichiers en pièces jointe
    (le fichier du model "Membre_aaa.php", il se nomme "Membre.php" en réalité, mais le forum ne permet pas d'envoyer 2 fichiers du même nom, et vu que mon controller se nomme "membre.php" ça coince)

    dans mon fichier "functions.php" il y a juste ça :
    <?php
    function get_current_view() {
    if (isset($_SESSION['current_view']))
    { $current_view = $_SESSION['current_view']; }
    else
    { $current_view = "views/_accueil.php"; }
    return $current_view;
    }
    ?>

    désolé c'est pas propre mais je n'arrive pas à indenter le code...
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Bon, c'est pas gagné. Tu demandes un cours complet sur le MVC et ses subtilités et là ça risque d'être long.

    J'ai essayé de reprendre en simplifiant à mort pour que tu vois globalement les enchaînements :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    // MODELE 
    class Membre
    {
        /**
         * @return array array([] => array(id, nom, prenom, email, login, pwd))
         */
        public function getAll()
        {
     
        }
     
        /**
         * @param array array(id, nom, prenom, email, login, pwd)
         * @return long new id
         */
        public function create(array $p)
        {
     
        }
     
        /* ... */
    }
     
    // CONTROLLER
    class MembreController
    {
        public function indexAction()
        {
            $membre = new Membre();
            $data   = $membre->getAll();
            // grâce à l'include $data sera disponible dans la vue (foreach $data...)
            include 'MembreIndex.html.php';
        }
     
        public function createAction()
        {
            include 'MembreInputForm.html.php';
        }
     
        public function creatSubmitAction()
        {
            $membre = new Membre();
     
            // récupération des données
            $data = array(
                'nom'    => $_POST['nom'],
                'prenom' => $_POST['prenom'],
                'email'  => $_POST['email'],
                'login'  => $_POST['login'],
                'pwd'    => $_POST['pwd']
            );
     
            // appel du modèle pour effectuer la création
            $exec = $membre->create($data);
            if ($exec) {
                // si ok 
            }
            else {
                // si erreur
            }
        }
    }
    La vue MembreIndex.html.php :
    Code html : 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
    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <title> test </title>
        <meta charset="utf-8" />
        <link rel="stylesheet" href="stylesheet.css" />
    </head>
    <body>
        <header>
            <p> HEADER </p>
        </header>
        <div id="belly"> 
            <nav>
                <h2> MENU </h2><BR>
                <a href="page_1.php"> page 1 </a><BR>
                <a href="page_2.php"> page 2 </a><BR>
                <a href="page_3.php"> page 3 </a><BR>
            </nav>
            <div id="view">
                <table>
                    <thead>
                        <tr>
                            <th>Id</th>
                            <th>Nom</th>
                            <th>Prenom</th>
                            <th>E-mail</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach($data as $v):?>
                        <tr>
                            <td><?php echo $v['id']?></td>
                            <td><?php echo $v['nom']?></td>
                            <td><?php echo $v['prenom']?></td>
                            <td><?php echo $v['email']?></td>
                        </tr>   
                        <?php endforeach?>
                    </tbody>
                </table>
            </div>
        </div>
        <footer>
            <p> FOOTER </p>
        </footer>   
    </body>
    </html>
    Tu dois bien comprendre que le MVC nécessite que tu aies un point d'entrée généralement unique pour l'ensemble de ton application. Cela t'oblige à mettre en place une redirection pour toutes les requêtes vers ce point d'entrée qui est dans 99% des cas index.php
    Ce point d'entrée ne contient rien mis à part le code nécessaire au démarrage de l'environnement de ton site par exemple :
    - définition des constantes
    - chargement du FrontController
    - délégation de la 1ère analyse de la requête au FrontController...

    Exemple (très simplifié) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    require 'bootstrap.php';
    $front_controller = new FrontController();
    $front_controller->dispatch();
    Dès que j'ai 5 min je posterai un tuto sur mon blog DVP sur le MVC car c'est récurrent et tant pis si c'est une redite...

  6. #6
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    merci beaucoup pour la réponse,

    je n'avais pas compris qu'un controller est une classe aussi (je pensais que seul les modèles seraient des classes)

    j'ai passé toute la nuit à essayer des trucs mais je n'y arrive malheureusement toujours pas...

    Je crois que ce qui m'embête le plus c'est :
    au moment où on appuie sur le bouton "voir la liste des membres", on va où ?
    je veux dire, l'attribut "action" de l'élément <form>, on doit lui mettre quelle valeur ?
    (j'aurai tendance à penser qu'on devrait mettre "MembreController.php", mais non je ne vois pas ce qu'on peut en faire en fait...)

    Je ne vois pas du tout comment on jongle entre les pages c'est trop bizarre...

    Je suis un peu découragé là, si tu veux bien me donner l'adresse de ton blog j'irai voir avec plaisir.

    Je vais me coucher, j'arrive plus à réfléchir...

    En tous cas merci encore pour ton aide.

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,
    Citation Envoyé par slack457 Voir le message
    au moment où on appuie sur le bouton "voir la liste des membres", on va où ?
    je veux dire, l'attribut "action" de l'élément <form>, on doit lui mettre quelle valeur ?
    (j'aurai tendance à penser qu'on devrait mettre "MembreController.php", mais non je ne vois pas ce qu'on peut en faire en fait...)
    Il faut bien lire le post précédent au sujet de la redirection.
    La conséquence directe est que le fichier pointé dans action n'est que tout relatif. Vu que quoi qu'il arrive, la requête sera redirigée vers la point d'entrée, tu peux très bien t'en affranchir et ne pointer que vers une route.
    A vrai dire, l'appel au contrôleur est implicite dans le MVC, tu ne pointeras jamais dessus.
    Si tu rames avec cette problématique, c'est qu'il doit te manquer un élément essentiel pour la compréhension du MVC : le routage.
    Comme tu l'as vu, le MVC décompose ton application en 3 et les actions ne sont plus directement appelables depuis l'extérieur. Donc pointer vers une fichier n'a plus trop de sens. Par contre avoir des routes explicites est bien plus intéressant. Pour piloter ton application avec une approche MVC, il faut lister les actions que tu souhaites réaliser, leur rattacher une route et enfin rattacher un controller à chaque route.
    Quelque chose comme ça :
    Table de routage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MEMBRES - ACTION + ROUTE + CONTROLLER
    action     : liste 
    route      : membre/liste
    controller : nom=MembreController.php ; action=listeAction
     
    action     : creer 
    route      : membre/creer
    controller : nom=MembreController.php ; action=creerAction
     
    action     : creerSoumission 
    route      : membre/creer/soumission
    controller : nom=MembreController.php ; action=creerSoumissionAction
    ...
    Comme tu peux le voir, il n'y plus de fichier pointé juste des actions à réaliser (des routes à emprunter). La manière dont ces actions sont traitées et par quel fichier n'a pas à sortir sur une page web.
    Tu peux aussi constater qu'il y a beaucoup de redondance dans ces définitions et les frameworks d'aujourd'hui t'aident à factoriser ceci. Il faut juste lire la doc pour savoir comment ils procèdent en interne.

    Pour voir la liste des membres : tu dois appeler l'url suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.site.com/membre/liste
    Dans un formulaire de création de membre dans action tu vas mettre du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action="membre/creer/soumission"
    Ensuite dès qu'une url est prise en charge par le point d'entrée, le front controller doit analyser une première fois l'url reçue par le serveur avec l'aide de la table de routage afin de trouver quelle route a été empruntée ensuite, il passera le flux du traitement au controller en charge cette route qui lui analysera en profondeur tous les autres paramètres reçus : $_POST, $_GET... afin de construire une réponse.

    Allez bon courage, en espérant avoir été assez clair

  8. #8
    Membre régulier Avatar de slack457
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 126
    Points : 98
    Points
    98
    Par défaut
    je vois, eh bien j'étais vraiment à coté de la plaque...

    je m'étais intéressé au framework ruby-on-rails il y a quelques temps, c'était la 1ère fois que j'entendais parler du modèle MVC,
    l'idée m'avait séduit, mais j'ai laissé tombé ruby-on-rails car trop peu de gens l'utilise.

    avec ce framework on pouvait appeler une fonction du controller dans une vue, ça interagissait tout seul avec le modèle etc, c'était très facile.

    Aujourd'hui je me suis dis que j'allais me remettre au modèle MVC mais sans framework.
    Mais je ne m'imaginais pas que j'allais rencontrer tant de problèmes...

    là je vois qu'on doit gérer un frontcontroller, je ne vois pas exactement ce que c'est, l'histoire du routage ça semble nouveau pour moi... Et il y a surement d'autres choses qui me passent au-dessus...

    Je pensais que ce serait plus simple que ça... Je me rend compte que quand j'utilisais ruby-on-rails, il devait y avoir énormément de choses qui se faisaient de façon transparente sans que je ne sois au courant de rien.

    C'est dommage mais à mon niveau je ne m'en sens pas capable.
    Je crois que je vais en rester là pour le moment...

    Si tu sors un tuto sur MVC un de ces jours j'irai voir avec plaisir
    (je ne te demande pas de faire un tuto hein, rien ne presse, c'est déjà super sympa de m'avoir donné un peu de ton temps)

    merci encore

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/03/2014, 16h51
  2. [recrutement]Projet PHP5 Objet / MVC / Zend
    Par amarcil dans le forum Autres
    Réponses: 0
    Dernier message: 02/11/2008, 16h17
  3. mvc et passage d'objets jsp <-> servlet
    Par uetac dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 10/09/2007, 14h42
  4. [Java] [MVC] Objet Observable et héritage
    Par loicdvi dans le forum MVC
    Réponses: 6
    Dernier message: 06/10/2006, 11h31
  5. [Convention]déclarations des objets
    Par allstar dans le forum Langage
    Réponses: 4
    Dernier message: 17/11/2005, 00h57

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