MVC avec PDO en Orienté Objet

Rechercher

MVC avec PDO en Orienté Objet

Par dancom5  -  16 reponses  -  Le 30/08/2013 23:40  -  Editer  - 

Bonjour tout le monde.

Je suis nouveau sur ce site et la partie qui m'intéresse est l'Orienté Objet. J'ai commencé à me faire un nouveau projet basé sur le tutoriel-ci:

http://www.apprendre-php.com/tutoriels/tutoriel-33-ralisation-d-un-livre-d-or-avec-pdo-et-mvc.html

Je me suis intéressé pour débuter au MVC pour séparer le codage PHP de l'affichage puisque je suis habitué au procédural. J'ai fini par comprendre en bonne parti le MVC mais je souhaite pouvoir le faire en Orienté Objet.

Je ne sais pas par où commencer pour appliquer l'orienté objet.

S'il y avait un exemple d'un début de site avec le MVC et Orienté Objet, ça m'aiderait.

Je suis débutant en MVC et POO.

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 03/09/2013 17:22  -  Haut de page  - 

Salut,
pour les exemples, actuellement, presque n'importe quel CMS pourrait faire l'affaire en matière de MVC.

Mais globalement, la question est paradoxale : avoir compris le MVC et en fin de compte demander comment ça fonctionne sont deux assertions contradictoires...
Mais il est vrai que bien des tutos sur le MVC sont assez lapidaires et insuffisamment détaillés pour un débutant complet : je te suggèrerais dont de te documenter sur « l'architecture logicielle » comme point de départ : l'idée, c'est de comprendre comment est-ce qu'on découpe une application et pourquoi. Note bien du reste que j'utilise à dessein le terme d' application au lieu de site web, et il faut raisonner avec cet état d'esprit. Pour un petit site web, la POO estpresque superflue, le procédural étant largement suffisant. Mais si on doit développer quelque chose de modulaire, extensible et pérenne, alors là en revanche la POO s'impose avec un découpage bien maitrisé pour simplifier les développements dans un premier temps et la maintenance à plus long terme.

Essaye d'affiner ta question en précisant quelle partie t'apparait comme floue, ce sera plus efficace pour tenter de te guider avec des réponses plus ciblées.

 
Par dancom5  -  Le 04/09/2013 05:59  -  Haut de page  - 

Salut Cyrano.

Pour le MVC, je pense que j'arrive à bien comprendre dans l'ensemble, c'est au niveau de l'orienté objet que je ne maitrise pas.

Disons voir si on peut faire des Class PHP sur certaine partie du script du Livre d'Or du tuto ici. Je tente de le faire.

 
Par Cyrano  -  Le 04/09/2013 07:38  -  Haut de page  - 

Ok, ça me situe un peu, la question qui se pose est alors la suivante : qu'as-tu compris de la programmation Orientée Objet ? Finalement, c'est quoi une classe et selon ce que tu en as saisi, à quoi ça sert ? Formulé autrement : pourquoi selon toi remplacer du procédural par de la POO ?

 
Par dancom5  -  Le 04/09/2013 22:43  -  Haut de page  - 

Le MVC sert à séparer en couches afin d'isoler le codage de la présentation.

Difficile à expliquer l'orienté objet mais ça s'utilise avec des classes qui sont comme une sorte de moule contenant des variables nommées attribue et des fonctions nommées méthodes. On s'en sert pour aider à séparer les couches de la présentation HTML et du codage PHP. Les Classes permet de faire des objets par l'instanciation comme pour une maison selon son plan.

J'ai passé à travers d'une quinzaine de tutoriels, mais ce que je n'arrive pas à assimiler, c'est plus sur l'ensemble quand on fait un site.

Je codais en procédural, toutes mes couches étaient mélangée. J'ai fini par comprendre une partie de la séparation.

Exemple: au lieu d'afficher par un "echo" dans le codage PHP, je le mets dans un "tableau[]" ailleurs en dehors d'où est situé le codage. La POO permet de faire plus et d'après moi, ça complète la séparation des couches. Ça permet la réutilisation du code aussi.

J'ai fais ceci en vu de le mettre en POO:
n.b. impossible de placer les balises CODE sans mauvais effet.

  //calcule le nombre de ligne trouvée et va chercher selon le critère id.
        $sth = $db->prepare('SELECT SQL_CALC_FOUND_ROWS * FROM categorie WHERE id = :id');
        $sth->bindParam(':id', $_GET['id'], PDO::PARAM_INT);
        $sth->execute();

  //va chercher le nombre de ligne trouvée.
        $rowCount = $db->query('SELECT FOUND_ROWS()');
        $rowCount = (int) $rowCount->fetchColumn(); 

        //vérifie si le nombre n'est pas zéros.
        $rc = ($rowCount===0) ? $rc = "Désolé, votre requête donne rien." : '';

        $html=array();
        while($row = $sth->fetch(PDO::FETCH_OBJ)) 
        {
                $html[]=$row->id;
                $html[]=$row->cat;
        }
 
Par Cyrano  -  Le 05/09/2013 01:14  -  Haut de page  - 

Mouais, pas mal mais pas tout à fait exact concernant les classes.

Schématiquement, une classe permet d'instancier des objets, ça, c'est vrai, mais en fin de compte, c'est quoi un objet. Prenons un exemple pratique simple : si on veut effectuer des calculs arithmétiques, on va écrire des opérations à chaque endroit où on a besoin d'un résultat donné. Supposons qu'au lieu de faire ça, on se serve d'un objet, en l'occurrence d'une calculatrice : dans ce cas, plus besoin d'écrire des calculs partout, on instancie une calculatrice, on lui passe des nombres en paramètres et on appelle telle ou telle méthode de la calculatrice pour obtenir le résultat.

L'idée des classes, ce n'est pas tant de séparer les couches de quoi que ce soit : c'est de construire une architecture logicielle beaucoup plus simple à maintenir et surtout beaucoup plus souple. Mais dans une application conçue en POO, il y a deux sortes de classes : les librairies génériques et le code métier.

Les librairies

Ce sont des classes qui vont être utilisables dans n'importe quelle application, et qui seront utilisées pour effectuer des opérations qu'on peut retrouver un peu partout. C'est par exemple la connexion à un serveur de base de données et les opération de lecture/écriture/modifications/suppression de données, c'est créer un fichier PDF, c'est manipuler des images, et bien d'autres choses encore. Intérêt de la chose : si on corrige un bogue dans une classe, toute l'application sera corrigée du même coup sans devoir ouvrir plus d'un seul fichier, chose pratiquement impossible en procédural.

Le code métier

Ce n'est pas générique, c'est un code qui est spécifique à une application donnée. Donc, pour rester simple, c'est par exemple la construction d'une page qui fera éventuellement appel à des classes de la librairie. On peut très bien imaginer une classe pour une page contenant les méthodes qui vont récupérer les données, récupérer le template approprié, traiter les données d'un formulaire, et retourner en fin de compte la page HTML vers le client.

L'architecture

On va devoir séparer tout ça : les librairies dans un répertoire, le code métier dans un autre. Et pour pousser plus loin, dans le cadre d'une construction en MVC, on aura les templates d'un coté, les controleurs ailleirs et les modèles dans un autre répertoire. Enfin, on aura les fichiers de script JS, les images et autres dans un autre endroit.

L'exercice

Essaye de schématiser le découpage des répertoires d'une application à partir de ces explications et de ce que tu as compris du système, quelque chose dont la base ressemblerait à ceci :

    /  
    |-/ lib  
    |-/ appli  
    |-/ www  
      |-/ imgs  
      |-/ css  
      |-/ js  

À compléter donc et au besoin à modifier.

Si tu arrives à comprendre ce découpage, la construction t'apparaitra du coup beaucoup moins floue.

 
Par dancom5  -  Le 06/09/2013 08:31  -  Haut de page  - 

Merci pour les explications des définitions.

Fait sur ma fonction que voici, ça donnerais quoi?

    <?php  

    ini_set('display_errors', 0);   

    function afficher(){  

      $html = array();  
      $id = (preg_match('/^[0-9]{1,6}$/', $_GET['id'])) ? $_GET['id'] : '';  
      $Errrq = 'l\'entrée n\'existe pas la base.';  

        try   
        {  
                    $db = new PDO("mysql:host=localhost;dbname=philipp4_bdd", "root", "pass");  
                    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  

                    $sth = $db->prepare('SELECT SQL_CALC_FOUND_ROWS * FROM categorie WHERE id = :id');  
                    $sth->bindParam(':id', $id, PDO::PARAM_INT);  
                    $sth->execute();  

                    $rowCount = $db->query('SELECT FOUND_ROWS()');  
                    $rowCount = (int) $rowCount->fetchColumn();   

                    if($rowCount == 0)  
                    {  
                $html[0]=$Errrq;  
                    }  
                    else  
                    {  
                            while($row = $sth->fetch(PDO::FETCH_OBJ))   
                            {  
                                    $html[]=$row->id;  
                                    $html[]=$row->cat;  
                            }  
                    }  

                    $sth->closeCursor();  

        }  
        catch(PDOException $e)   
        {  
            echo 'debug : '.$e->getMessage();  
        }              

        return $html[0].' '.$html[1];  

    }  

    echo afficher();  

    ?>  

ps, j'ai placé entre balise code, et ça donne ce que vous voyez, mais au moins c'est intégral.

    <?php   
    class Maclass {  

    function affiche(){  

      Le contenu du code plus haut...  

    }  
    }  

    $test=new affiche();  
    $test->afficher;  

Quand je fais $test->afficher, ça ne fonctionne pas. Je sais que ce n'est pas complet mais ma fonction sans la classe ça marche bien.

C'est que j'aimerais avoir un exemple d'une classe à partir de ma fonction.

Merci d'avance.

PS2, ça bien l'air que ce n'est pas la bonne balise pour afficher les code ici.

 
Par Cyrano  -  Le 06/09/2013 15:27  -  Haut de page  - 

Salut,
pour la mise en forme, j'ai édité ton message pour corriger. Il faut utiliser la syntaxe « markdown »
Pour le reste, tu tentes de mettre la charrue avant les boeufs. Relis ma précédente réponse, et réponds à la question, ce sera plus clair quand tu auras assimilé le point évoqué.

 
Par dancom5  -  Le 06/09/2013 23:23  -  Haut de page  - 

Ok, désolé, je n'avais pas bien compris pour le dernier paragraphe.
Même si ça saute au yeux.

    /-controller/-controller.inc.php (les éléments de vérification des formulaire, etc.)  
    /-model/-model.inc.php (les taches liées à la base de données)  
    /-view/-view.inc.php (l'affichage vue par le public)  
    /-index.php (dispatcher répartissant les taches)  

ps, je suis allé voir pour l'application des codes.

Pour le mvc, c'est ce que j'ai fais avec l'un de mes codes.

Les requêtes à la base de données devrait se faire au model et la vérification des demandes se font au controleur. En principe.

 
Par Cyrano  -  Le 06/09/2013 23:42  -  Haut de page  - 

Mouais, donc, si on peut admettre que tu as retenu l'essentiel de la théorie, tu n'as malheureusement pas compris la pratique pour autant...

J'ajoute qu'il te manque un autre élément, la discipline : lis attentivement les réponses et n'essaye pas de répondre avant la fin de la question en croyant avoir compris quelle est la question complète : lis bien la question jusqu'à la fin et analyse, réfléchis avant de formuler une réponse. Et si un élément te semble étrange ou si un aspect de la question te semble bizarre, alors pose des questions pour avoir le complément d'information approprié. La programmation n'est en aucun cas un jeu de devinettes, c'est purement et simplement binaire, les réponses sont oui ou non, vrai ou faux, ouvert ou fermé, rien d'autre. Il faut raisonner de la même manière en décomposant un problème complexe en autant de problèmes simples que nécessaire.

Je t'ai montré un squelette d'architecture : à toi de compléter en ajoutant les répertoires manquant tout en gardant un maximum de logique. Si tu veux évoluer vers la POO et les constructions en MVC, il est indispensable que tu comprennes ce point, sinon, tu vas perdre ton temps et les cheveux que tu vas t'arracher jour après jours.

 
Par dancom5  -  Le 07/09/2013 00:02  -  Haut de page  - 

Bonjour Cyrano et merci pour votre aide.

C'est vrai que ma compréhension se situe au niveau théorique. J'ai une collection de tutoriels sur le MVC et POO de plusieurs sites et ce que j'arrive à faire, ce sont des bouts de code comme les exemples. Pour ce qui est de la pratique, c'est l'intégration à quelque chose d'existant qui me pose problème.

J'avais pris le script du tutoriel "Livre d'Or" que j'ai modifié pour ne prendre que l'aspect pour afficher un contenu. Et c'est à partir de là, que j'ai commencer à comprendre la théories en regardant comment c'était fait et en modifiant pour tester. J'ai toujours appris en visionnant un contenu et en le modifiant pour voir les résultats. Ces temps-ci, je tente de voir en comparant entre procédural et POO.

Bien, je vais faire ce qu'il fait pour avancer.

J'ai encore des difficulté avec le controleur et le model. J'ai examiné le livre d'or et j'essaie de comprendre en testant,modifiant, etc.

 
Par Cyrano  -  Le 07/09/2013 02:36  -  Haut de page  - 

Ça, c'est me MVC : lorsqu'on débute, c'est une notion qui est assez abstraite et j'ai rarement vu des tutos réellement clairs et explicites sur le sujet.

Néanmoins, il faut aussi savoir que le MVC est un design pattern composite. Ça veut dire qu'il serait utile d'avoir une idée de ce que sont les design patterns.
Si on découpe le MVC, on a (très schématiquement) :

  • Le contrôleur : il reçoit la requête HTTP et ses éventuels paramètres : il sélectionne selon ces paramètres le modèle approprié qui va prendre en charge le traitement des données; il va ensuite sélectionne la vue appropriée, comprendre par là, le plus souvent, le ou les templates qui vont devoir être utilisés pour construire le retour.
  • Le modèle : appelé par le contrôleur et initialisé selon des paramètres ou l'absence de paramètre, c'est là que vont être récupérées les informations requises, éventuellement via une ou plusieurs requêtes SQL par exemple. Ou encore, effectuera le traitement de données pour procéder à des enregistrement. Le modèle est la passerelle entre le contrôleur et les données.
  • La vue : le plus souvent, ce sont des gabarits (ou templates), on y trouve en principe pas de traitement ni de fonctions, mais par contre on y trouvera beaucoup plus probablement un paquet de variables qui devront être initialisées dans le contrôleur. Ce dernier en effectuant l'inclusion du gabarit construit le contenu du retour à retourner. Il n'existe aucun lien direct entre la vue et le modèle. Ça veut dire aussi que la modification du modèle n'a aucune conséquence sur la vue dans la mesure où les données attendues par le contrôleurs restent les mêmes.

Maintenant la question qui risque de se poser : comment est-ce qu'on découpe une application ? Comment est-ce qu'on définit un contrôleur ?
L'idée de faire des essais de modifications sur un code procédural existant n'est peut-être pas forcément l'approche la plus simple. Il faut arriver à comprendre individuellement les différents éléments qui composent la POO d'une part et le MVC d'autre part. Or le MVC implique obligatoirement de la POO.

Mais j'en reviens à la question de l'architecture à laquelle tu n'as toujours pas donné de suite : et à nouveau, j'insiste sur le fait que, tant que tu ne comprendras pas cette partie, tu vas perdre un temps fantastique pour rien et tu n'avanceras pas. Mais si je ne te donne pas une réponse toute faite, c'est parce que je préfère tenter de t'amener à découvrir par toi-même les réponses. Pour ça, je t'indique des pistes, à toi de les suivre... ou pas...

Je vais te suggérer de commencer par la programmation objet : oublie le livre d'or un moment et essaye de construire une classe Calculatrice avec comme méthode les quatre opérations arithmétiques de base. Comment est-ce que tu ferais ça et comment l'utiliserais-tu ? Code, teste et montre moi ça, que ça fonctionne ou non.

 
Par dancom5  -  Le 09/09/2013 03:57  -  Haut de page  - 

Je crois que j'ai beaucoup à apprendre, je vais donc pour commencer me mettre à l'étude de la base sur les Class. Je vais y revenir pour solutionner la calculatrice. Merci pour l'initiation.Je veux continuer, mais j'ai besoin d'un peu de temps.

 
Par dancom5  -  Le 12/09/2013 06:17  -  Haut de page  - 

Bonjour Cyrano, j'ai finit par le faire la calculatrice.

    <?php  

    class Calculatrice {  

    private $n1;  
    private $n2;  

    public function getMul($n1,$n2){  
        $this->n1=$n1;  
        $this->n2=$n2;  
        return $this->n1 * $this->n2;  
    }  

    public function getDiv($n1,$n2){  
        $this->n1=$n1;  
        $this->n2=$n2;  
        return $this->n1 / $this->n2;  
    }  

    public function getAdd($n1,$n2){  
        $this->n1=$n1;  
        $this->n2=$n2;  
        return $this->n1 + $this->n2;  
    }  

    public function getSub($n1,$n2){  
        $this->n1=$n1;  
        $this->n2=$n2;  
        return $this->n1 - $this->n2;  
    }  

    }  

    $calculatrice = new Calculatrice();  
    echo '8*4 = '.$calculatrice->getMul(8,4).'<br>';  
    echo '8/4 = '.$calculatrice->getDiv(8,4).'<br>';  
    echo '8+4 = '.$calculatrice->getSub(8,4).'<br>';  
    echo '8-4 = '.$calculatrice->getAdd(8,4).'<br>';  

    echo '(8+4)(8+4) = '.$calculatrice->getAdd(8,4)$calculatrice->getAdd(8,4).'<br>';  

    ?>  

J'ai compris des choses intéressantes.

C'est certain que j'ai encore fort à faire.

Pour le constructeur, je l'avait mis mais, j'ai enlevé vu que je ne voyais pas vraiment à quoi ça sert si c'est juste pour le déclarer sans rien mettre dedans.

 
Par Cyrano  -  Le 12/09/2013 06:37  -  Haut de page  - 

Salut,
effectivement, il reste du travail.

Construite de cette façon, il est vrai que ça doit fonctionner, mais le gain par rapport au procédural est quasiment nul. Et à ce compte, même en gardant une classe, tu pourrais simplifier pas mal, par exemple comme ceci :

    <?php  
    class Calculatrice  
    {  
        public function getMul($n1,$n2)  
        {  
            return $n1 * $n2;  
        }  
        public function getDiv($n1,$n2)  
        {  
            return $n1 / $n2;  
        }  
        public function getAdd($n1,$n2)  
        {  
            return $n1 + $n2;  
        }  
        public function getSub($n1,$n2)  
        {  
            return $n1 - $n2;  
        }  
    }

Si tu conserves le reste du code strictement identique, tu obtiendras les mêmes résultats. Je te laisse comparer les deux classes, la tienne et la mienne.
Pose-toi la question suivante : comment devrais-tu transformer ça pour une utilisation plus proche de ce que tu as l'habitude de faire sur une calculatrice de poche.

 
Par dancom5  -  Le 12/09/2013 07:06  -  Haut de page  - 

Je viens de l'essayer et ça donne le même résultat.

Si je comprends la question, ça serait de faire en sorte que je puisse mettre des paramètres pour avoir un nombre inconnu de chiffres pour additionner dans l'extenciation.

Genre <pre><code>
$objet=new Class();
$objet->$methode($n1,$n2,...);
</code></pre>

d'où les "..." représente un nombre inconnu à savoir un certain nombre de chiffre sans savoir combien au départ. Comme pour une vraie calculatrice, quand on fait un calcule, on ajoute des chiffres au moment du calcule.

 
Par Cyrano  -  Le 12/09/2013 07:14  -  Haut de page  - 

Voilà, ça se précise et j'ai idée que tu commences à voir mieux le chemin :)

Si on fait de la POO, c'est avec l'idée de se servir d'objets, virtuels certes, mais des objets quand même : mais leur utilisation ne devrait en principe pas tellement différer de l'utilisation d'objets physiques. Partant de là, imagines la manière dont tu utilises une calculatrice de poche : isole les méthodes, les paramètres et la manière dont on s'en sert. Et de là, si on analyse ta classe, il y a bien deux propriétés et quatre opérations, mais elle ne peut servir que pour deux nombres et ne permet pas d'enchainer des calculs comme tu pourrais le faire avec une calculatrice physique.

Je te laisse y réfléchir, je ne serai pas disponible en journée, ça te laisse le temps d'y penser et d'imaginer comment tu pourrais procéder pour améliorer notablement ta classe :)

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |