24 juin 2013

PHP MVC

24.6.13 - 1

Vous n'avez jamais utilisé un Framework PHP, vous n'êtes pas familier avec la philosophie MVC, ou simplement vous vous demandez pourquoi il y a tant d'agitation autour des Framework PHP (Symfony, Zend, …), dans cet article vous aller écrire un simple test utilisant MVC (Modèle-Vue-Controller).

php-mvc

On va commencer par écrire une page simple qui affiche la liste des articles qui ont sauvegardé dans la base de données (écrit en pur PHP) :

<?php
    $cnx = mysql_connect('localhost', 'NomUtisateur', 'MotDePasse');
    mysql_select_db('MaBase', $cnx);
    $result = mysql_query('SELECT * FROM article', $cnx);
?>
<!doctype html>
<html>
<head>
    <title>PHP MVC</title>
</head>
<body>

    <h2>Liste des articles</h2>
    <ul>
    <?php while($row = mysql_fetch_assoc($result)){ ?>
        <li>
            <a href="/show.php?id=<?php echo $row['id']; ?>">
                <?php echo $row['titre']; ?>
            </a>
        </li>
    <?php } ?>
    </ul>

</body>
</html>
<?php mysql_close($cnx); ?>

Contrôleur

La philosophie MVC est de séparer les couches logiques d'une application, pour mieux structuré le code. Pour appliquer un test MVC à notre exemple précédent.
Premièrement, on va séparer le code HTML:

<?php
// index.php

    $cnx = mysql_connect('localhost', 'NomUtilisateur', 'MotDePasse');
    mysql_select_db('MaBase', $cnx);
    $result = mysql_query('SELECT * FROM article', $cnx);
  
    $articles = array();
    while($row = mysql_fetch_assoc($result)){
        $articles[] = $row;
    }
    mysql_close($cnx);
  
    require 'view/list.php';
?>

Le code HTML est maintenant dans un fichier séparé (view/list.php), qui est essentiellement un fichier HTML qui utilise une syntaxe PHP de template :

<!doctype html>
<html>
<head>
    <title>PHP MVC</title>
</head>
<body>

    <h2>Liste des articles</h2>
    <ul>
    <?php foreach($articles as $article){ ?>
        <li>
            <a href="/show.php?id=<?php echo $article['id']; ?>">
                <?php echo $article['titre']; ?>
            </a>
        </li>
    <?php } ?>
    </ul>

</body>
</html>

Le fichier qui contient la logique applicative "index.php" est appelé «contrôleur». Le terme contrôleur est un mot que vous allez entendre souvent, quel que soit le framework utilisé. Il fait simplement référence à votre code qui traite les entrées de l'utilisateur et prépare une réponse.
Le contrôleur dans notre cas prépare les données récupérer de la base de données et inclut ensuite un template pour présenter ces données.

Modèle

Pour l'instant, l'application ne contient qu'une seule page. Mais que faire si une deuxième page a besoin d'utiliser la même connexion, ou le même tableau de la base de données?
Les fonctions d'accès aux données de l'application soient isolés dans un nouveau fichier appelé model.php:

<?php
// model/model.php

    function ouvrir_database()
    {
        $cnx = mysql_connect('localhost', 'NomUtilisateur', 'MotDePasse');
        mysql_select_db('MaBase', $cnx);
        return $cnx;
    }
  
    function fermer_database($cnx)
    {
        mysql_close($cnx);
    }
  
    function all_articles()
    {
        $cnx = ouvrir_database();
        $result = mysql_query('SELECT * from article', $cnx);
        $articles = array();
        while($row = mysql_fetch_assoc($result)){
            $articles[] = $row;
        }
        fermer_database($cnx);
        return $articles;
    }
  
?>

Le contrôleur "index.php" est maintenant très simple :

<?php
// index.php

    require_once 'model/model.php';
    $articles = all_articles();
    require 'view/list.php';
?>

Maintenant, la responsabilité du contrôleur "index.php" est de récupérer les données de la couche modèle de l'application et d'appeler le template à afficher ces données.

Vue

Pour ne pas dupliquer le code de template, on va créer un nouveau fichier "layout.php":

<!-- view/layout.php -->
<!doctype html>
<html>
<head>
    <title><?php echo $titre; ?></title>
</head>
<body>

    <?php echo $content; ?>

</body>
</html>

Le template "view/list.php" peut maintenant simplement hériter du "layout.php" :

<!-- view/list.php -->

<?php $titre = 'PHP MVC'; ?>

<?php ob_start() ?>
    <h2>Liste des articles</h2>
    <ul>
    <?php foreach($articles as $article){ ?>
        <li>
            <a href="/show.php?id=<?php echo $article['id']; ?>">
                <?php echo $article['titre']; ?>
            </a>
        </li>
    <?php } ?>
    </ul>
<?php $content = ob_get_clean(); ?>
<?php include 'layout.php'; ?>

Maintenant, on peut réutiliser du layout.

Page de détail

Pour ajouter une page de détail d'article ("show.php"), qui affiche un article identifié par un "id".
Il suffit de créer une fonction dans le fichier "model.php" qui récupère un seul article en fonction d'un "id" passé en paramètre:

// model.php

function detail_article($id)
{
    $cnx = ouvrir_database();
    $query = 'SELECT * FROM article WHERE id='.$id;
    $result = mysql_query($query);
    $row = mysql_fetch_assoc($result);
    fermer_database($cnx);
  
    return $row;
}

Puis créez un nouveau fichier appelé "show.php", le contrôleur pour cette nouvelle page est:

<?php
// show.php

    require_once 'model/model.php';
  
    $article = detail_article($_GET['id']);
    require 'view/show.php';
?>

Finalement, créez un nouveau fichier de template view/show.php afin d'afficher les détails d’un article:

<!-- view/show.php -->

<?php $titre = 'Détail'; ?>

<?php ob_start(); ?>
    <h2><?php echo $article['titre']; ?></h2>
    <div>
        <?php echo $article['contenu']; ?>
    </div>
    <div><?php echo $article['date_creation']; ?></div>

<?php $content = ob_get_clean(); ?>
<?php include 'layout.php'; ?>

Nous venons de voir un petit test du motif MVC. C’est vraiment facile et aucun code n'est dupliqué.
Télécharger le code source de ce petit exemple.

Newsletter

Abonnez-vous à notre newsletter pour recevoir les nouveautés.

1 commentaire:

  1. Cool! Merci pour cet exemple d'utilisation du modèle MVC "from scratch"

    RépondreSupprimer

© 2014 Déveur. WP Theme-junkie converted by Bloggertheme9
Powered by Blogger.
back to top