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 :

Évoluer vers une architecture MVC en PHP [Tutoriel]


Sujet :

Langage PHP

  1. #1
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Points : 13 061
    Points
    13 061
    Par défaut Évoluer vers une architecture MVC en PHP


    Baptiste Pesquet vous propose un article Évoluer vers une architecture MVC en PHP.

    L'objectif de cet article est de découvrir comment améliorer l'architecture d'un site Web en passant d'une organisation classique (monopage) à une organisation respectant le modèle MVC.
    N'hésitez pas à faire part de vos remarques, commentaires et encouragements sur cet article !

    Évoluer vers une architecture MVC en PHP.

    Pour contacter les différents services du club (publications, partenariats, publicité, ...) : Contacts

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 23
    Points : 38
    Points
    38
    Par défaut
    J'aime la conclusion, "en fait tout ça c'est de la merde, utilisez un framework". Sinon très bon article

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 24
    Points
    24
    Par défaut
    Très bon article qui en aidera plus d'un à bien comprendre pourquoi et comment séparer les différentes parties de son code.

    Merci bien

  4. #4
    Membre expérimenté
    Avatar de Jarodd
    Profil pro
    Inscrit en
    Août 2005
    Messages
    851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 851
    Points : 1 717
    Points
    1 717
    Par défaut
    Très bon article pour comprendre comment migrer vers une structure MVC, c'est progressif et bien écrit.

    Juste cette phrase qui n'est pas claire (dans le paragraphe LIII-C-1) :

    On remarque au passage que la technologie d'accès à la base est totalement masquée aux modèles concrets, et que Modele utilise la technique du chargement tardif (lazy loading) pour retarder l'instanciation de l'objet $bdd à sa première utilisation.
    Elle n'est pas compréhensible dans ce contexte (qu'est-ce que le lazy loading ?).

  5. #5
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par Jarodd Voir le message
    ...

    Elle n'est pas compréhensible dans ce contexte (qu'est-ce que le lazy loading ?).
    Il s'agit d'une technique de programmation qui consiste à retarder une opération le plus tard possible, jusqu'au moment où cette opération devient indispensable.

    Dans l'exemple choisi, plutôt que d'instancier l'objet PDO $bdd dans le constructeur de la classe Modele (ce qui déclenche la connexion BD), on retarde son instanciation au moment du premier accès BD.

    La plupart du temps, l'initialisation tardive d'un objet est encapsulée dans un accesseur vers cet objet. Appliquée systématiquement, cette technique peut permettre d'améliorer l'efficacité d'une application. Ici, elle est plutôt utilisée à titre d'exemple.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 657
    Points : 1 240
    Points
    1 240
    Par défaut
    J'aime la conclusion, "en fait tout ça c'est de la merde, utilisez un framework". Sinon très bon article
    Les devs php sont les seuls à ne pas utiliser de framework , tout les autres ( .net , ruby , python , java , ... ) utilisent des frameworks pour leurs applications web. Est ce que les devs java ou ruby sont plus idiots ou fainéants que les devs ? PHP

    La véritable question est , est-ce que coder toute la couche HTTP d'un site est intéressant ? absolument pas , ce qui est intéressant , c'est la logique métier , les services en backend etc ...

    Alors quand on apprend , je veux bien , mais au final , les apps sont de plus en plus complexes , ont besoin de beaucoup plus de sécurité , ajax , webservices, formulaires ,internationalisation , etc ...

    Bref , utiliser un framework même léger genre laravele , slim ,fatfree ou silex est indispensable , à moins d'être maso.

    Perso j'utilise Silex qui est parfait pour "refactoriser" du vieux code , et est fourni avec des outils de tests fonctionnels , comme son grand frère symfony,et le coup sur les perfs est minime.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Peu ton utilisé ce genre de structure pour pouvoir également ajouter d'autre page(module) à notre MVC ? Genre une page de contact etc ...

  8. #8
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Très bon article. C'est bien d'avoir expliqué le MVC en ayant commencé avec le procédural, cela permet de mieux séparer les problèmes.

    En rentrant dans le détail, je trouve la présentation du modèle objet de PHP superflue, sauf peut-être pour ceux qui viennent d'autres langages, sinon elle serait très insuffisante pour comprendre la suite du code. Mais bon ce n'est pas l'essentiel, ni le sujet.

    Félicitations pour ce travail complet, bien structuré et bien documenté

  9. #9
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 14
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par julien.L Voir le message
    Peu ton utilisé ce genre de structure pour pouvoir également ajouter d'autre page(module) à notre MVC ? Genre une page de contact etc ...
    Une fois l'architecture mise en place, on peut tout à fait enrichir le site en ajoutant les classes modèle et contrôleur nécessaires, ainsi que les vues associées. C'est tout l'intérêt de la structuration d'une application : fournir un cadre pour guider et faciliter les évolutions.

    Citation Envoyé par ABCIWEB Voir le message
    Très bon article. C'est bien d'avoir expliqué le MVC en ayant commencé avec le procédural, cela permet de mieux séparer les problèmes.

    En rentrant dans le détail, je trouve la présentation du modèle objet de PHP superflue, sauf peut-être pour ceux qui viennent d'autres langages, sinon elle serait très insuffisante pour comprendre la suite du code. Mais bon ce n'est pas l'essentiel, ni le sujet.

    Félicitations pour ce travail complet, bien structuré et bien documenté
    Je suis d'accord avec la remarque sur le modèle objet de PHP, qui est présenté très vite. Cet article est tiré d'un cours donné à des étudiants qui avaient une année scolaire de vécu POO, uniquement en C#. J'ai hésité à supprimer cette partie, mais je me suis finalement dit que ça ne pouvait pas faire de mal de la laisser telle quelle.

    Pour le reste, merci pour les compliments

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    @ bpesquet :

    En faite j'aurai voulu savoir si dans notre fonction routerRequete on pouvait avoir une sorte de ce code ci-dessous :

    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
     
    // Si un module est specifié, on regarde s'il existe
    if (!empty($_GET['module'])) {
     
    	$module = dirname(__FILE__).'/modules/'.$_GET['module'].'/';
     
    	// Si l'action est specifiée, on l'utilise, sinon, on tente une action par défaut
    	$action = (!empty($_GET['action'])) ? $_GET['action'].'.php' : 'index.php';
     
    	// Si l'action existe, on l'exécute
    	if (is_file($module.$action)) {
     
    		include $module.$action;
     
    	// Sinon, on affiche la page d'accueil !
    	} else {
     
    		include 'global/accueil.php';
    	}
     
    // Module non specifié ou invalide ? On affiche la page d'accueil !
    } else {
     
    	include 'global/accueil.php';
    }

    Mon but en fait, serait de faire un mini CMS qui contiendrai plusieurs modules ainsi qu'un backoffice.

  11. #11
    Membre averti Avatar de shell13010
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2008
    Messages : 281
    Points : 314
    Points
    314
    Par défaut
    Article très intéressant.

    Concernant les frameworks, je comprend que sa facilite le travail etc...

    Mais pour utiliser un framework, je pense qu'il est important de comprendre le fonctionnement d'un framework et donc qu'il faut obligatoirement par l'apprentissage.

    Je pense que créer son propre framework, et plus qu'utile. Certe on s'arrachera les cheveux mais il n'y a pas mieux pour apprendre et avancé.


    Citation Envoyé par Camus3
    est-ce que coder toute la couche HTTP d'un site est intéressant ?
    Je pense que sa serait intéressant pour apprendre et comprendre après se n'es que mon avis.
    "Quelle prétention de prétendre que l'informatique est récente: Adam et Eve avaient déjà un Apple!"

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    A- Dans le chapitre IV.a je ne comprend pas ceci :

    les noms des champs dans la base de données sont utilisés dans toute l'application, jusqu'aux vues. Cela rend risqué un changement du schéma BD;
    B- Dans notre class Modele, on peut intégrer dans des fonctions toutes nos modèles de requêtes telle que : sauvegarder, éditer .... ?

    Encore merci

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    A/ Tu vois que dans les vues on utilise $billet['BIL_CONTENU'], $billet['BIL_TITRE'], $billet['BIL_DATE'], $commentaire['COM_AUTEUR'], $commentaire['COM_CONTENU'], etc. qui sont directement issues des requêtes et donc les indexes de ces variables sont les champs des tables "t_billet" et "t_commentaire".
    Si l'on venait à changer le nom des champs dans les tables, il faudrait donc modifier en conséquence le nom de ces indexes dans tous les scripts qui les utilisent, notamment les vues.

    B/ Nan la classe "modele" est une classe abstraite, tu vois bien qu'elle ne contient que des méthodes génériques. Si tu veux modifier ou supprimer un billet, logiquement les méthodes générant ces requêtes devraient être dans la classe "Billet" et celles pour modifier ou supprimer un commentaire dans la classe "Commentaire".

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    A- Merci

    B- Dans la class Modele, on ne peut pas considérer par exemple une fonction qui supprime ?

    Ensuite on utilise cette méthode à chaque class un peu comme la fonction executerLecture


    C- Ne serait-il pas mieux d'utiliser une classe implémentant le singleton pour PDO ?

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    B/ Les requêtes sont écrites dans les classes filles qui héritent du modèle. Le modèle quant à lui se contente de l'exécution de la requête.

    Donc dans la classe "Billet" tu pourrais ajouter cette méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Supprime un billet
    public function supprimer($id)
        {
            $this->executerModification('DELETE FROM t_billet WHERE BIL_ID = ?',
                array($id));
        }
    Ainsi tu utilise la fonction générique "executerModification" du modèle pour exécuter la fonction de suppression de billet qui est écrite dans ta classe "billet"

    C/ Oui pourquoi pas

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci pour ta réponse qui m'éclairci bien

    voici le code de ma class singleton :

    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
    class PDO2 extends PDO {
        public static $_instance = NULL;
        public function __construct(){
            try {
     
                self::$_instance = new PDO('mysql:host=***;dbname=***', '***', '***');
                self::$_instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                self::$_instance = NULL;
            }
            catch(PDOException $e){
                die('Erreur : . ' . $e->getMessage());
            }
        }
        public static function getInstance(){
            if(!isset(self::$_instance)){
                self::$_instance = new PDO2();
            }
            return self::$_instance;
        }
    }
    J'ai rechercher sur le net un peu partout, j'aurai aimer savoir si ma classe était correctement codée et si des améliorations sont à faire je suis preneur

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et pourquoi tu détruit l'instance ? Voici un exemple plus classique
    Mais bon je te suggère plutôt d'ouvrir un autre sujet pour les questions qui n'ont pas un rapport direct avec l'article présenté dans ce topic.

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Bah c'était pour détruire l'objet

    Merci pour tes réponses.

    Désolé t'avoir fais un HS

    Revenons au tutoriel

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 36
    Points : 56
    Points
    56
    Par défaut Merci et bravo
    Excellent article, vraiment.
    C'est un exploit d'évoquer ce sujet de façon progressive en si peu de pages
    Gardez le morceau sur la POO. Même si on connait ça rassure de voir que l'auteur vous prend par la main tranquillement pour vous amener vers l'objectif.

  20. #20
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 32
    Points : 27
    Points
    27
    Par défaut Requêtes préparées
    Bonjour,

    tout d'abord un grand merci pour ce tuto, je débute en php et il m'a été d'une grande aide.
    J'aurais une question sur la partie POO, plus précisément la classe Modele. J'aimerais savoir s'il est possible de mettre en place une requête préparée du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    $bdd = getBDD();
    	$req = $bdd->prepare('SELECT auteur, commentaire, date_commentaire FROM commentaires WHERE id_billet = :id_billet'); 
        $req->bindParam(':id_billet', $id_billet, PDO::PARAM_INT );
        $req->execute();
        $comms = $req->fetchAll();

    Classe Modele:

    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
     
     
    abstract class Modele {
     
        private $bdd;
     
        // Exécute une requête SQL de lecture dans la base
        protected function executerLecture($sql, $accederPremierResultat = false) {
            $stmtResultats = $this->getBdd()->query($sql);
            if ($ accederPremierResultat == true)
                return $stmtResultats->fetch();  // Accès au premier résultat
            else
                return $stmtResultats;
        }
     
        // Renvoie un objet de connexion à la BDD
        private function getBdd() {
            if ($this->bdd === null) {
                $this->bdd = new PDO(
                    'mysql:host=localhost;dbname=monblog;charset=utf8',
                    'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
            }
            return $this->bdd;
        }
     
    }


    Merci pour vos réponses!!!

Discussions similaires

  1. [AJAX] Ajax avec une architecture MVC en PHP
    Par chrill dans le forum jQuery
    Réponses: 5
    Dernier message: 06/09/2013, 14h43

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