Développez vos sites en utilisant une architecture MVC

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
Header1.png

Yop :RG:,

Dans ce tutoriel je vais vous apprendre à utiliser une architecture MVC pour développer vos sites.

Déjà avant de commencer, qu'est ce que le MVC ?
Le MVC (Model View Controller) est une façon de gérer son code, le Controller s'occupe de la partie gestion (if ..), le Model regroupe des fonctions qui vont interagir avec la base de donnée , et comme son nom l'indique la View permet l'affichage de la page.

En utilisant l'architecture MVC, il n'y a pas que la façon de coder qui va changer, en effet les URLs vont êtres difrentes, tout ça dépendra des routes que vous avez configurées.

Exemple : article.php?action=view&id=5 deviendra article/view/5

Sans se casser la tête à utiliser un htaccess pour chaque page.

Développez un site avec une architecture MVC requiert des notions de base en POO. (Programmation Orientée Objet)

Je vous ai uploadé une base MVC , elle est disponible à la fin du topic.


Séparateur.png

Trêve de bavardage passons au code, téléchargez mon fichier .rar et placez les fichiers dans un dossier vide.
Dans votre navigateur rendez-vous dessus et vous remarquerez que dans l'URL, vous avez été redirivers /home , c'est normal pas de panique !

Ouvrez avec votre éditeur de texte (Atom pour ma part) le fichier Model.php (Core/Model.php), et rentrez-y les informations de connexion à votre base de donnée.

Maintenant ouvrez Home.php (Controllers/Home.php), si vous n'avez jamais touché à la POO ou vu un code fait en POO vous serez sûrement entrain de vous dire que c'est pas de votre niveau, mais suivez bien le tutoriel, c'est super simple !

Premièrement nous déclarons la classe et l’étendons au controller Principal, afin qu'il hérite des fonctions pré-faîtes.

PHP:
class Home extends Controller


Ensuite juste en-dessous nous définissons une variable préfix et un tableau contenu dans une variable $d, le "préfix" nous sera utile pour gérer le titre de notre page plus facilement, quant au tableau il nous permettra de faire passer des variables à la vue , on y reviendra plus tard.

PHP:
var $d = array();
var $prefix = "RealityGaming - ";


Puis en-dessous nous créons une fonction publique nommée index qui ne prend aucun paramètre, c'est cette fonction qui va gérer la route /home .

Pour vous familiariser avec l'architecture MVC, je vous invite à créer vous-même une route nome test puis effectuez un echo dedans, le code sera donné juste en-dessous mais c'est de sorte à ce que vous compreniez le principe.

PHP:
public function test(){
    echo "Route /home/test";
}


Dans l'URL ajoutez /test, c'est magique le texte s'affiche !

Désormais nous allons rendre une vue et faire passer des variables, autrement dit un titre, une description et une phrase.

Pour information, si vous voulez rendre une vue, assurez-vous de mettre un fichier qui se situe dans un dossier nommé comme la classe de la fonction.
Nous sommes dans la classe Home, donc il faudra un dossier Home dans la Views, puis concernant les fichiers, peu importe le nom de ceux-ci, il n'y a pas de règle à leur sujet, vous les nommez comme vous voulez.

Rappelez-vous de ce tableau contenu dans la variable $d que nous avons défini en haut de notre code, nous allons l'utiliser.

Dans la fonction test, mettez-y ce code.

PHP:
$d['info'] = array(
   'title'    => $this->prefix."Test",
   'description'   => "Route de test",
    'phrase'  => "Notre première route par {VotrePseudo}"
);


Nous mettons un tableau qui contient nos variables dans le tableau $d. (un tableau dans un tableau quoi..)
Il faut désormais rendre la vue et faire passer les variables ! Donc pour cela ajoutez ça.

PHP:
$this->set($d);
$this->render('test');


Pensez bien à créer un fichier test.php dans le dossier !
Pour tester si les variables sont bien passées et ont les bonnes valeurs, je vous invite à faire un var_dump de la variable $info dans votre fichier test.php.
PHP:
var_dump($info);


Chez moi ça fonctionne bien j'ai comme résultat :​
array (size=3)
'title' => string 'RealityGaming - Test' (length=20)
'description' => string 'Route de test' (length=13)
'phrase' => string 'Notre première route par Maxime' (length=39)


La variable $info vient de votre controller, lorsque nous avons placé un tableau dans un tableau, et bien c'est ce second tableau qui a été extrait vers notre fichier, d'où le fait qu'il faille mettre $info['title'] par exemple pour récupérer le titre au-lieu de $d['title'].


Séparateur2.png


Plutôt que de vous faire un long tutoriel sur l'architecture MVC, je pense qu'il serait plus judicieux de vous montrer comment utiliser le MVC dans un cas concret.

Nous allons donc gérer un système d'article , avec un ID qui passe dans l'URL, et un listing des articles , vous allez donc voir comment jouer jouer avec les URLs.

Premièrement nous voulons avoir /article, donc il faut créer un fichier Article.php (Controllers/), et un dossier article dans le dossier Views.

Voilà le code que j'ai pour débuter.

PHP:
<?php

class Article extends Controller {

    var $d = array();
    var $prefix = "RealityGaming - ";

    public function index()
    {
        echo "ok";
    }

}

?>


Allez sur /article, si tout se passe bien vous devriez voir un "ok" apparaître, enlevez le du code s'il s'affiche.

Sur cette route, nous allons afficher la liste des articles, donc pour cela, il faut créer un model, dans le dossier Models, créez un fichier, nommez le comme vous voulez et mettez y ce bout de code.

PHP:
<?php

class Articles extends Model {



}

?>


Attention ! Il ne faut pas mettre une classe identique entre le Model et le Controller, cela va provoquer une erreur car une classe ne peut pas être appelée plus d'une fois.

Dans le controller, chargez le model que vous venez de créer, je l'ai appelé Articles.php donc il faudra mettre :
PHP:
$model = $this->loadModel('articles');

Vous n'avez pas de souci à vous faire concernant les majuscules.
Maintenant que le model est chargé, on va créer la fonction qui va récupérer tous les articles, afin qu'on fasse un foreach plus simplement dans la Views.

Voici la fonction.

PHP:
public function getAllArticles(){
    return $this::getDb()->query('SELECT * FROM article');
}


Notre fonction est désormais faîte, il faut ensuite finir le controller afin de rendre la vue et d'envoyer notre fonction à la Views, rien de compliqué vous allez voir !

PHP:
$d['var'] = array(
    'title'          => $this->prefix."Les articles",
    'description'    => "Les articles du site",
    'getAllArticles' => $model->getAllArticles()
);

$this->set($d);
$this->render('index');


Voici la suite de la fonction index(), mettez ce code sous la ligne qui charge le model ! Ensuite dans votre fichier index.php dans Views, il faut faire un foreach afin que la liste des articles soit affichées, je vous donne mon fichier complet, c'est du PHP basique ça, pas besoin de vous expliquer chaque chose.
HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['title']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Les articles du site</h3>
        <ul>
            <?php
                foreach($var['getAllArticles'] as $article){
                    ?>
                        <li><a href="article/view/<?= $article['id']; ?>"><?= $article['titre']; ?></a></li>
                    <?php
                }
            ?>
        </ul>
    </body>
</html>


Vous pouvez apercevoir que je met un lien vers /article/view/{id}, ce sera une page dédié à un article qui aura comme ID celui qui passe dans l'URL, il faut donc faire la route view qui prend un paramètre ID, puis une fonction pour récupérer les informations de l'article.
Voici la fonction.
PHP:
public function view($params1){
    if(!$params1 || !is_numeric($params1) || $params1 < 1){
        header('Location:'.WEBROOT);
        exit();
    }
}


Le code se répète, vous devriez commencer à véritablement comprendre le fonctionnement du MVC, on créer une fonction publique nommée view, mais cette fois-ci qui contient un paramètre, $params1 aura comme valeur l'ID qui passe en URL, c'est comme ça qu'il faut faire pour passer des paramètres dans l'URL, vous pouvez enchaîner les paramètres en les séparant d'une virgule.
Le nom de la variable n'a aucune importance, j'ai pris l'habitude de mettre $params1, $params2 et ainsi de suite, mais vous nommez vos variables comme vous le voulez !

Ensuite il faut faire une fonction qui va récupèrer les informations de l'article qui a comme ID celui qui passe en URL, rendez-vous dans le le model des articles et placez-y cette fonction.
PHP:
public function getArticleById($id){
    $q = $this::getDb()->prepare('SELECT * FROM article WHERE id = :id');
    $q->execute(['id' => $id]);

    return $q->fetch();
}


Puis dans notre controller il faut charger le model et appeler la fonction.
PHP:
$model = $this->loadModel('articles'); // On charge le model articles
$article = $model->getArticleById($params1); // On utilise la fonction getAllArticleById en passant l'id de l'url

if(!$article){ // Si l'article n'existe pas
    header('Location:'.WEBROOT);
    exit();
}

$d['var'] = array(
    'titre' => $this->prefix.$article['titre'],
    'description'   => "Article numéro ".$article['id'],
    'article'   => $article
);

$this->set($d);
$this->render('view'); // On rend la vue à view.php


Voici la suite de la fonction, on charge le model, on appelle une fonction qui récupère les informations de l'article en lui donnant l'ID qui passe dans l'URL, puis je rends la vue à un fichier View.php.

Pour finir il faut dans notre vue afficher les informations de l'article, voici le code de ma page view.php.
Code:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['titre']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Article numéro <?= $var['article']['id']; ?> - <?= $var['article']['titre']; ?></h3>
            <p><?= $var['article']['contenu'] ?></p>
    </body>
</html>


Un fetch nous rend un tableau qui contient ce qu'il a récupèré, rappelez-vous que dans notre model nous en avons fait un, d'où le fait qu'il faille mettre $var['article']['titre'] par exemple pour récupèrer le titre de l'article.
Encore une fois c'est du PHP basique, pas besoin de détailler ça.

Voilà ce que j'ai sur mon navigateur :

Après c'est à vous de gérer le design et d'ajouter des fonctionnalis suppmentaires.

Grâce à l'architecture MVC vous n'aurez plus besoin de répeter votre code, de faire 150 lignes pour inscrire un membre, c'est un des avantages que l'architecture MVC vous offre.

Le tutoriel touche à sa fin, vous devriez désormais maîtriser ces points-ci :
  • Faire une route
  • Gérer les fichiers d'un MVC
  • Intéragir avec la base de donnée
  • Faire passer des paramètres dans l'URL


Si vous avez une remarque ou une question, n'hésitez pas à m'envoyer un message privé !

:tchuss:
 

Fichiers joints

  • RG.rar
    2.7 KB · Affichages: 33
Inscription
1 Janvier 2015
Messages
5 087
Réactions
2 373
Points
20 610

Yop :RG:,

Dans ce tutoriel je vais vous apprendre à utiliser une architecture MVC pour développer vos sites.

Déjà avant de commencer, qu'est ce que le MVC ?
Le MVC (Model View Controller) est une façon de gérer son code, le Controller s'occupe de la partie gestion (if ..), le Model regroupe des fonctions qui vont interagir avec la base de donnée , et comme son nom l'indique la View permet l'affichage de la page.

En utilisant l'architecture MVC, il n'y a pas que la façon de coder qui va changer, en effet les URLs vont êtres difrentes, tout ça dépendra des routes que vous avez configurées.

Exemple : article.php?action=view&id=5 deviendra article/view/5

Sans se casser la tête à utiliser un htaccess pour chaque page.

Développez un site avec une architecture MVC requiert des notions de base en POO. (Programmation Orientée Objet)

Je vous ai uploadé une base MVC , elle est disponible à la fin du topic.


Voir la pièce jointe 101547

Trêve de bavardage passons au code, téléchargez mon fichier .rar et placez les fichiers dans un dossier vide.
Dans votre navigateur rendez-vous dessus et vous remarquerez que dans l'URL, vous avez été redirivers /home , c'est normal pas de panique !

Ouvrez avec votre éditeur de texte (Atom pour ma part) le fichier Model.php (Core/Model.php), et rentrez-y les informations de connexion à votre base de donnée.

Maintenant ouvrez Home.php (Controllers/Home.php), si vous n'avez jamais touché à la POO ou vu un code fait en POO vous serez sûrement entrain de vous dire que c'est pas de votre niveau, mais suivez bien le tutoriel, c'est super simple !

Premièrement nous déclarons la classe et l’étendons au controller Principal, afin qu'il hérite des fonctions pré-faîtes.

PHP:
class Home extends Controller

Ensuite juste en-dessous nous définissons une variable préfix et un tableau contenu dans une variable $d, le "préfix" nous sera utile pour gérer le titre de notre page plus facilement, quant au tableau il nous permettra de faire passer des variables à la vue , on y reviendra plus tard.

PHP:
var $d = array();
var $prefix = "RealityGaming - ";

Puis en-dessous nous créons une fonction publique nommée index qui ne prend aucun paramètre, c'est cette fonction qui va gérer la route /home .

Pour vous familiariser avec l'architecture MVC, je vous invite à créer vous-même une route nome test puis effectuez un echo dedans, le code sera donné juste en-dessous mais c'est de sorte à ce que vous compreniez le principe.

PHP:
public function test(){
    echo "Route /home/test";
}

Dans l'URL ajoutez /test, c'est magique le texte s'affiche !

Désormais nous allons rendre une vue et faire passer des variables, autrement dit un titre, une description et une phrase.

Pour information, si vous voulez rendre une vue, assurez-vous de mettre un fichier qui se situe dans un dossier nommé comme la classe de la fonction.
Nous sommes dans la classe Home, donc il faudra un dossier Home dans la Views, puis concernant les fichiers, peu importe le nom de ceux-ci, il n'y a pas de règle à leur sujet, vous les nommez comme vous voulez.

Rappelez-vous de ce tableau contenu dans la variable $d que nous avons défini en haut de notre code, nous allons l'utiliser.

Dans la fonction test, mettez-y ce code.

PHP:
$d['info'] = array(
   'title'    => $this->prefix."Test",
   'description'   => "Route de test",
    'phrase'  => "Notre première route par {VotrePseudo}"
);

Nous mettons un tableau qui contient nos variables dans le tableau $d. (un tableau dans un tableau quoi..)
Il faut désormais rendre la vue et faire passer les variables ! Donc pour cela ajoutez ça.

PHP:
$this->set($d);
$this->render('test');

Pensez bien à créer un fichier test.php dans le dossier !
Pour tester si les variables sont bien passées et ont les bonnes valeurs, je vous invite à faire un var_dump de la variable $info dans votre fichier test.php.
PHP:
var_dump($info);

Chez moi ça fonctionne bien j'ai comme résultat :


La variable $info vient de votre controller, lorsque nous avons placé un tableau dans un tableau, et bien c'est ce second tableau qui a été extrait vers notre fichier, d'où le fait qu'il faille mettre $info['title'] par exemple pour récupérer le titre au-lieu de $d['title'].


Voir la pièce jointe 101548


Plutôt que de vous faire un long tutoriel sur l'architecture MVC, je pense qu'il serait plus judicieux de vous montrer comment utiliser le MVC dans un cas concret.

Nous allons donc gérer un système d'article , avec un ID qui passe dans l'URL, et un listing des articles , vous allez donc voir comment jouer jouer avec les URLs.

Premièrement nous voulons avoir /article, donc il faut créer un fichier Article.php (Controllers/), et un dossier article dans le dossier Views.

Voilà le code que j'ai pour débuter.

PHP:
<?php

class Article extends Controller {

    var $d = array();
    var $prefix = "RealityGaming - ";

    public function index()
    {
        echo "ok";
    }

}

?>

Allez sur /article, si tout se passe bien vous devriez voir un "ok" apparaître, enlevez le du code s'il s'affiche.

Sur cette route, nous allons afficher la liste des articles, donc pour cela, il faut créer un model, dans le dossier Models, créez un fichier, nommez le comme vous voulez et mettez y ce bout de code.

PHP:
<?php

class Articles extends Model {



}

?>

Attention ! Il ne faut pas mettre une classe identique entre le Model et le Controller, cela va provoquer une erreur car une classe ne peut pas être appelée plus d'une fois.

Dans le controller, chargez le model que vous venez de créer, je l'ai appelé Articles.php donc il faudra mettre :
PHP:
$model = $this->loadModel('articles');
Vous n'avez pas de souci à vous faire concernant les majuscules.
Maintenant que le model est chargé, on va créer la fonction qui va récupérer tous les articles, afin qu'on fasse un foreach plus simplement dans la Views.

Voici la fonction.

PHP:
public function getAllArticles(){
    return $this::getDb()->query('SELECT * FROM article');
}

Notre fonction est désormais faîte, il faut ensuite finir le controller afin de rendre la vue et d'envoyer notre fonction à la Views, rien de compliqué vous allez voir !

PHP:
$d['var'] = array(
    'title'          => $this->prefix."Les articles",
    'description'    => "Les articles du site",
    'getAllArticles' => $model->getAllArticles()
);

$this->set($d);
$this->render('index');

Voici la suite de la fonction index(), mettez ce code sous la ligne qui charge le model ! Ensuite dans votre fichier index.php dans Views, il faut faire un foreach afin que la liste des articles soit affichées, je vous donne mon fichier complet, c'est du PHP basique ça, pas besoin de vous expliquer chaque chose.
HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['title']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Les articles du site</h3>
        <ul>
            <?php
                foreach($var['getAllArticles'] as $article){
                    ?>
                        <li><a href="article/view/<?= $article['id']; ?>"><?= $article['titre']; ?></a></li>
                    <?php
                }
            ?>
        </ul>
    </body>
</html>

Vous pouvez apercevoir que je met un lien vers /article/view/{id}, ce sera une page dédié à un article qui aura comme ID celui qui passe dans l'URL, il faut donc faire la route view qui prend un paramètre ID, puis une fonction pour récupérer les informations de l'article.
Voici la fonction.
PHP:
public function view($params1){
    if(!$params1 || !is_numeric($params1) || $params1 < 1){
        header('Location:'.WEBROOT);
        exit();
    }
}

Le code se répète, vous devriez commencer à véritablement comprendre le fonctionnement du MVC, on créer une fonction publique nommée view, mais cette fois-ci qui contient un paramètre, $params1 aura comme valeur l'ID qui passe en URL, c'est comme ça qu'il faut faire pour passer des paramètres dans l'URL, vous pouvez enchaîner les paramètres en les séparant d'une virgule.
Le nom de la variable n'a aucune importance, j'ai pris l'habitude de mettre $params1, $params2 et ainsi de suite, mais vous nommez vos variables comme vous le voulez !

Ensuite il faut faire une fonction qui va récupèrer les informations de l'article qui a comme ID celui qui passe en URL, rendez-vous dans le le model des articles et placez-y cette fonction.
PHP:
public function getArticleById($id){
    $q = $this::getDb()->prepare('SELECT * FROM article WHERE id = :id');
    $q->execute(['id' => $id]);

    return $q->fetch();
}

Puis dans notre controller il faut charger le model et appeler la fonction.
PHP:
$model = $this->loadModel('articles'); // On charge le model articles
$article = $model->getArticleById($params1); // On utilise la fonction getAllArticleById en passant l'id de l'url

if(!$article){ // Si l'article n'existe pas
    header('Location:'.WEBROOT);
    exit();
}

$d['var'] = array(
    'titre' => $this->prefix.$article['titre'],
    'description'   => "Article numéro ".$article['id'],
    'article'   => $article
);

$this->set($d);
$this->render('view'); // On rend la vue à view.php

Voici la suite de la fonction, on charge le model, on appelle une fonction qui récupère les informations de l'article en lui donnant l'ID qui passe dans l'URL, puis je rends la vue à un fichier View.php.

Pour finir il faut dans notre vue afficher les informations de l'article, voici le code de ma page view.php.
Code:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['titre']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Article numéro <?= $var['article']['id']; ?> - <?= $var['article']['titre']; ?></h3>
            <p><?= $var['article']['contenu'] ?></p>
    </body>
</html>

Un fetch nous rend un tableau qui contient ce qu'il a récupèré, rappelez-vous que dans notre model nous en avons fait un, d'où le fait qu'il faille mettre $var['article']['titre'] par exemple pour récupèrer le titre de l'article.
Encore une fois c'est du PHP basique, pas besoin de détailler ça.

Voilà ce que j'ai sur mon navigateur :

Après c'est à vous de gérer le design et d'ajouter des fonctionnalis suppmentaires.

Grâce à l'architecture MVC vous n'aurez plus besoin de répeter votre code, de faire 150 lignes pour inscrire un membre, c'est un des avantages que l'architecture MVC vous offre.

Le tutoriel touche à sa fin, vous devriez désormais maîtriser ces points-ci :



    • Faire une route
    • Gérer les fichiers d'un MVC
    • Intéragir avec la base de donnée
    • Faire passer des paramètres dans l'URL


Si vous avez une remarque ou une question, n'hésitez pas à m'envoyer un message privé !

:tchuss:
Rédaction de malade :o. Mérite une récompense
 

Ruby.

Undefined
Inscription
25 Avril 2012
Messages
518
Réactions
118
Points
11 846
Salut @Maxime

J'ai ça comme erreur
Code:
Warning: require(/opt/lampp/htdocs/Views/Home/index.php): failed to open stream: Aucun fichier ou dossier de ce type in /opt/lampp/htdocs/Core/Controller.php on line 17

Fatal error: require(): Failed opening required '/opt/lampp/htdocs/Views/Home/index.php' (include_path='.:/opt/lampp/lib/php') in /opt/lampp/htdocs/Core/Controller.php on line 17

EDIT : finalement j'ai trouvé il suffit d'aller dans le dossier Views et de mettre Home et pas home
 
Dernière édition:

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
Salut @Maxime

J'ai ça comme erreur
Code:
Warning: require(/opt/lampp/htdocs/Views/Home/index.php): failed to open stream: Aucun fichier ou dossier de ce type in /opt/lampp/htdocs/Core/Controller.php on line 17

Fatal error: require(): Failed opening required '/opt/lampp/htdocs/Views/Home/index.php' (include_path='.:/opt/lampp/lib/php') in /opt/lampp/htdocs/Core/Controller.php on line 17

EDIT : finalement j'ai trouvé il suffit d'aller dans le dossier Views et de mettre Home et pas home

Salut,

Oui il y a quelques personnes qui ont des soucis avec les majuscules, c'est bizarre j'ai aucun souci de mon côté, sûrement à cause de la version de PHP ^^'
 

Rivals

Ancien staff
Inscription
27 Août 2016
Messages
1 705
Réactions
895
Points
13 104
Salut,

Oui il y a quelques personnes qui ont des soucis avec les majuscules, c'est bizarre j'ai aucun souci de mon côté, sûrement à cause de la version de PHP ^^'
Ça dépend de l'OS, je sais que lorsqu'on formait Walky & Fara il y avait eu un soucis de casse :p
 
S

Socket

C'est possible de montrer le "models" de ton article.php pour voir comment il se présente ? Car je suis un peu perdu ! .-.

Car j'essaye de faire mon modèle mais il me dit qu'il y a une erreur je sais pas où ! è.é (Peux pas voir depuis mon hébergeur..)
 

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
C'est possible de montrer le "models" de ton article.php pour voir comment il se présente ? Car je suis un peu perdu ! .-.

Car j'essaye de faire mon modèle mais il me dit qu'il y a une erreur je sais pas où ! è.é (Peux pas voir depuis mon hébergeur..)

Montre ton Model et ton erreur :p Tout est dis dans le topic ^^
Ça dépend de l'OS, je sais que lorsqu'on formait Walky & Fara il y avait eu un soucis de casse :p
Ah D:
 

Westiix

Fortnite Player || PHP & VB.NET
Premium
Inscription
5 Octobre 2011
Messages
2 219
Réactions
88
Points
12 753
Super tuto !
Cordialement, Westiix
 
Dernière édition:

Julien Moreau

Lobby-Man
Premium
Inscription
5 Février 2013
Messages
1 675
Réactions
686
Points
8 870

Yop :RG:,

Dans ce tutoriel je vais vous apprendre à utiliser une architecture MVC pour développer vos sites.

Déjà avant de commencer, qu'est ce que le MVC ?
Le MVC (Model View Controller) est une façon de gérer son code, le Controller s'occupe de la partie gestion (if ..), le Model regroupe des fonctions qui vont interagir avec la base de donnée , et comme son nom l'indique la View permet l'affichage de la page.

En utilisant l'architecture MVC, il n'y a pas que la façon de coder qui va changer, en effet les URLs vont êtres difrentes, tout ça dépendra des routes que vous avez configurées.

Exemple : article.php?action=view&id=5 deviendra article/view/5

Sans se casser la tête à utiliser un htaccess pour chaque page.

Développez un site avec une architecture MVC requiert des notions de base en POO. (Programmation Orientée Objet)

Je vous ai uploadé une base MVC , elle est disponible à la fin du topic.


Voir la pièce jointe 101547

Trêve de bavardage passons au code, téléchargez mon fichier .rar et placez les fichiers dans un dossier vide.
Dans votre navigateur rendez-vous dessus et vous remarquerez que dans l'URL, vous avez été redirivers /home , c'est normal pas de panique !

Ouvrez avec votre éditeur de texte (Atom pour ma part) le fichier Model.php (Core/Model.php), et rentrez-y les informations de connexion à votre base de donnée.

Maintenant ouvrez Home.php (Controllers/Home.php), si vous n'avez jamais touché à la POO ou vu un code fait en POO vous serez sûrement entrain de vous dire que c'est pas de votre niveau, mais suivez bien le tutoriel, c'est super simple !

Premièrement nous déclarons la classe et l’étendons au controller Principal, afin qu'il hérite des fonctions pré-faîtes.

PHP:
class Home extends Controller

Ensuite juste en-dessous nous définissons une variable préfix et un tableau contenu dans une variable $d, le "préfix" nous sera utile pour gérer le titre de notre page plus facilement, quant au tableau il nous permettra de faire passer des variables à la vue , on y reviendra plus tard.

PHP:
var $d = array();
var $prefix = "RealityGaming - ";

Puis en-dessous nous créons une fonction publique nommée index qui ne prend aucun paramètre, c'est cette fonction qui va gérer la route /home .

Pour vous familiariser avec l'architecture MVC, je vous invite à créer vous-même une route nome test puis effectuez un echo dedans, le code sera donné juste en-dessous mais c'est de sorte à ce que vous compreniez le principe.

PHP:
public function test(){
    echo "Route /home/test";
}

Dans l'URL ajoutez /test, c'est magique le texte s'affiche !

Désormais nous allons rendre une vue et faire passer des variables, autrement dit un titre, une description et une phrase.

Pour information, si vous voulez rendre une vue, assurez-vous de mettre un fichier qui se situe dans un dossier nommé comme la classe de la fonction.
Nous sommes dans la classe Home, donc il faudra un dossier Home dans la Views, puis concernant les fichiers, peu importe le nom de ceux-ci, il n'y a pas de règle à leur sujet, vous les nommez comme vous voulez.

Rappelez-vous de ce tableau contenu dans la variable $d que nous avons défini en haut de notre code, nous allons l'utiliser.

Dans la fonction test, mettez-y ce code.

PHP:
$d['info'] = array(
   'title'    => $this->prefix."Test",
   'description'   => "Route de test",
    'phrase'  => "Notre première route par {VotrePseudo}"
);

Nous mettons un tableau qui contient nos variables dans le tableau $d. (un tableau dans un tableau quoi..)
Il faut désormais rendre la vue et faire passer les variables ! Donc pour cela ajoutez ça.

PHP:
$this->set($d);
$this->render('test');

Pensez bien à créer un fichier test.php dans le dossier !
Pour tester si les variables sont bien passées et ont les bonnes valeurs, je vous invite à faire un var_dump de la variable $info dans votre fichier test.php.
PHP:
var_dump($info);

Chez moi ça fonctionne bien j'ai comme résultat :


La variable $info vient de votre controller, lorsque nous avons placé un tableau dans un tableau, et bien c'est ce second tableau qui a été extrait vers notre fichier, d'où le fait qu'il faille mettre $info['title'] par exemple pour récupérer le titre au-lieu de $d['title'].


Voir la pièce jointe 101548


Plutôt que de vous faire un long tutoriel sur l'architecture MVC, je pense qu'il serait plus judicieux de vous montrer comment utiliser le MVC dans un cas concret.

Nous allons donc gérer un système d'article , avec un ID qui passe dans l'URL, et un listing des articles , vous allez donc voir comment jouer jouer avec les URLs.

Premièrement nous voulons avoir /article, donc il faut créer un fichier Article.php (Controllers/), et un dossier article dans le dossier Views.

Voilà le code que j'ai pour débuter.

PHP:
<?php

class Article extends Controller {

    var $d = array();
    var $prefix = "RealityGaming - ";

    public function index()
    {
        echo "ok";
    }

}

?>

Allez sur /article, si tout se passe bien vous devriez voir un "ok" apparaître, enlevez le du code s'il s'affiche.

Sur cette route, nous allons afficher la liste des articles, donc pour cela, il faut créer un model, dans le dossier Models, créez un fichier, nommez le comme vous voulez et mettez y ce bout de code.

PHP:
<?php

class Articles extends Model {



}

?>

Attention ! Il ne faut pas mettre une classe identique entre le Model et le Controller, cela va provoquer une erreur car une classe ne peut pas être appelée plus d'une fois.

Dans le controller, chargez le model que vous venez de créer, je l'ai appelé Articles.php donc il faudra mettre :
PHP:
$model = $this->loadModel('articles');
Vous n'avez pas de souci à vous faire concernant les majuscules.
Maintenant que le model est chargé, on va créer la fonction qui va récupérer tous les articles, afin qu'on fasse un foreach plus simplement dans la Views.

Voici la fonction.

PHP:
public function getAllArticles(){
    return $this::getDb()->query('SELECT * FROM article');
}

Notre fonction est désormais faîte, il faut ensuite finir le controller afin de rendre la vue et d'envoyer notre fonction à la Views, rien de compliqué vous allez voir !

PHP:
$d['var'] = array(
    'title'          => $this->prefix."Les articles",
    'description'    => "Les articles du site",
    'getAllArticles' => $model->getAllArticles()
);

$this->set($d);
$this->render('index');

Voici la suite de la fonction index(), mettez ce code sous la ligne qui charge le model ! Ensuite dans votre fichier index.php dans Views, il faut faire un foreach afin que la liste des articles soit affichées, je vous donne mon fichier complet, c'est du PHP basique ça, pas besoin de vous expliquer chaque chose.
HTML:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['title']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Les articles du site</h3>
        <ul>
            <?php
                foreach($var['getAllArticles'] as $article){
                    ?>
                        <li><a href="article/view/<?= $article['id']; ?>"><?= $article['titre']; ?></a></li>
                    <?php
                }
            ?>
        </ul>
    </body>
</html>

Vous pouvez apercevoir que je met un lien vers /article/view/{id}, ce sera une page dédié à un article qui aura comme ID celui qui passe dans l'URL, il faut donc faire la route view qui prend un paramètre ID, puis une fonction pour récupérer les informations de l'article.
Voici la fonction.
PHP:
public function view($params1){
    if(!$params1 || !is_numeric($params1) || $params1 < 1){
        header('Location:'.WEBROOT);
        exit();
    }
}

Le code se répète, vous devriez commencer à véritablement comprendre le fonctionnement du MVC, on créer une fonction publique nommée view, mais cette fois-ci qui contient un paramètre, $params1 aura comme valeur l'ID qui passe en URL, c'est comme ça qu'il faut faire pour passer des paramètres dans l'URL, vous pouvez enchaîner les paramètres en les séparant d'une virgule.
Le nom de la variable n'a aucune importance, j'ai pris l'habitude de mettre $params1, $params2 et ainsi de suite, mais vous nommez vos variables comme vous le voulez !

Ensuite il faut faire une fonction qui va récupèrer les informations de l'article qui a comme ID celui qui passe en URL, rendez-vous dans le le model des articles et placez-y cette fonction.
PHP:
public function getArticleById($id){
    $q = $this::getDb()->prepare('SELECT * FROM article WHERE id = :id');
    $q->execute(['id' => $id]);

    return $q->fetch();
}

Puis dans notre controller il faut charger le model et appeler la fonction.
PHP:
$model = $this->loadModel('articles'); // On charge le model articles
$article = $model->getArticleById($params1); // On utilise la fonction getAllArticleById en passant l'id de l'url

if(!$article){ // Si l'article n'existe pas
    header('Location:'.WEBROOT);
    exit();
}

$d['var'] = array(
    'titre' => $this->prefix.$article['titre'],
    'description'   => "Article numéro ".$article['id'],
    'article'   => $article
);

$this->set($d);
$this->render('view'); // On rend la vue à view.php

Voici la suite de la fonction, on charge le model, on appelle une fonction qui récupère les informations de l'article en lui donnant l'ID qui passe dans l'URL, puis je rends la vue à un fichier View.php.

Pour finir il faut dans notre vue afficher les informations de l'article, voici le code de ma page view.php.
Code:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title><?= $var['titre']; ?></title>
        <meta name="description" content="<?= $var['description']; ?>">
    </head>
    <body>
        <h3>Article numéro <?= $var['article']['id']; ?> - <?= $var['article']['titre']; ?></h3>
            <p><?= $var['article']['contenu'] ?></p>
    </body>
</html>

Un fetch nous rend un tableau qui contient ce qu'il a récupèré, rappelez-vous que dans notre model nous en avons fait un, d'où le fait qu'il faille mettre $var['article']['titre'] par exemple pour récupèrer le titre de l'article.
Encore une fois c'est du PHP basique, pas besoin de détailler ça.

Voilà ce que j'ai sur mon navigateur :

Après c'est à vous de gérer le design et d'ajouter des fonctionnalis suppmentaires.

Grâce à l'architecture MVC vous n'aurez plus besoin de répeter votre code, de faire 150 lignes pour inscrire un membre, c'est un des avantages que l'architecture MVC vous offre.

Le tutoriel touche à sa fin, vous devriez désormais maîtriser ces points-ci :



    • Faire une route
    • Gérer les fichiers d'un MVC
    • Intéragir avec la base de donnée
    • Faire passer des paramètres dans l'URL


Si vous avez une remarque ou une question, n'hésitez pas à m'envoyer un message privé !

:tchuss:
Super tuto merci ;)
 

Ruby.

Undefined
Inscription
25 Avril 2012
Messages
518
Réactions
118
Points
11 846
Je comprend vraiment rien à ton truc d'article y'a des trucs je sais même pas où les mettre tu indiques pas où faut les mettre je parle pour le truc du view là article/view/{id}
...

Tu peux pas mettre les codes sources avec le RG.rar ?
 

WhiiTe'

Administateur
Ancien staff
Inscription
22 Octobre 2011
Messages
14 706
Réactions
8 492
Points
32 425
Je comprend vraiment rien à ton truc d'article y'a des trucs je sais même pas où les mettre tu indiques pas où faut les mettre je parle pour le truc du view là article/view/{id}
...

Tu peux pas mettre les codes sources avec le RG.rar ?
Suffit de suivre le tutoriel et tu y arriveras,viens en privé pour l'aide : )
 
Haut