Bien débuter avec le Framework Silex – Les sessions utilisateur

05 décembre 2017 - : MVC Silex - : Pas de commentaire

Bien débuter avec le Framework Silex – Les sessions utilisateur

Après avoir vu comment créer une route, un contrôleur et une vue, nous allons regarder du côté de la connexion à la base de données.

En effet, de nombreux sites dynamiques stockent leur contenu dans une base de données, souvent MySQL, qui permet de créer les pages « à la volée » en injectant le contenu depuis cette base.

Silex utilise le service Doctrine pour gérer cette connexion. Nous allons donc commencer par installer Doctrine.

Pour ce faire, il faut ouvrir une invite de commandes, aller dans le dossier de notre projet (c:\xampp\htdocs\monprojet par exemple) puis entrer la commande suivante

composer require doctrine/dbal

Une fois Doctrine installé, nous allons devoir éditer quelques fichiers pour activer la connexion.

Allons dans le fichier config/prod.php et ajoutons les lignes suivantes (à adapter en fonction de votre hébergement)

$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
	'db.options' => array(
		'driver' => 'pdo_mysql',
		'host' => 'nouvellernbase.mysql.db',
		'dbname' => 'mabase',
		'user' => 'root',
		'password' => '',
		'charset'  => 'utf8'
	)
));

Nous enregistrons le fournisseur de service Doctrine en lui ajoutant les options :

  • driver : ici nous utiliserons PDO pour MySQL, mais nous pourrions utiliser le driver pour Oracle ou d’autres systèmes
  • host : localisation du serveur
  • dbname : nom de la base de données
  • user : identifiant utilisateur de base de données
  • password : mot de passe de la base de données
  • charset : facultatif, jeu de caractères utilisé pour les requêtes

A partir de maintenant, nous avons accès à notre base de données depuis notre application.

La base de données

Voici le modèle de base de données (simple) que nous allons utiliser. Il s’agit d’un mini système de blog.

Dans l’exemple ci-dessous, nous allons afficher tous les articles du blog sur une page en affichant le titre, le contenu, la date et le pseudo de l’utilisateur.

Le modèle

Dans le MVC, le modèle assure une et une seule fonction, gérer les requêtes effectuées en base de données.

Le modèle est un fichier PHP objet qui contient une Classe regroupant les fonctions dont nous aurons besoin.

Nous allons créer un modèle qui contiendra l’ensemble des fonctions de sélection, ajout, modification et suppression de nos articles.

Le fichier s’appellera articlesModels.php et sera stocké dans le dossier src.

Son contenu de base sera le suivant

<?php
use Doctrine\DBAL\Connection;

class articlesModels {

}

Attention, le nom de la classe et le nom du fichier doivent être identiques.

Créons la fonction de sélection des articles

La requête SQL nécessaire pour sélectionner tous les articles sera la suivante

SELECT articles.*, utilisateurs.pseudo FROM articles LEFT JOIN utilisateurs ON articles.utilisateurs_userid = utilisateurs.userid

La fonction exécutant cette fonction dans notre modèle s’intégrera donc de la façon suivante dans le fichier articlesModels.php

<?php
use Doctrine\DBAL\Connection;

class articlesModels {
    public function getArticles($app){
        $sql = "SELECT articles.*, utilisateurs.pseudo FROM articles LEFT JOIN utilisateurs ON articles.utilisateurs_userid = utilisateurs.userid";
        return $app['db']->fetchAll($sql);
    }
}

Dans cette fonction :

  • getArticles($app) est le nom de la fonction, qui prend en paramètre d’entrée l’instance $app de notre application
  • return permet de retourner une réponse
  • $app[‘db’] représente la connexion à la base de données
  • fetchAll est utilisé afin de récupérer l’intégralité des résultats

Le contrôleur

Une fois le modèle créé, il va être nécessaire de l’appeler depuis le contrôleur.

Nous allons créer une route /blog, qui permettra d’afficher la liste des articles.

Cette route devra interroger la base de données pour obtenir cette liste, puis la transmettre à une vue afin de réaliser l’affichage.

Voici le code du contrôleur

$app->get('/blog', function () use ($app){
    $articlesModel = new articlesModels();
    $articles = $articlesModel->getArticles($app);
    return $app['twig']->render('blog.html.twig', array('articles'=> $articles));
})
->bind('monblog')
;
  • /blog est le chemin de notre route (accessible par exemple sur http://localhost/monprojet/web/blog)
  • new articlesModels() permet de créer une instance de la classe articlesModels et de la stocker dans la variable $articlesModel
  • $articles = $articlesModel->getArticles($app) stocke dans $articles le résultat de l’exécution de la fonction getArticles (qui récupère la liste des articles)
  • La ligne « return » va générer la vue à partir du fichier blog.html.twig auquel nous passons la variable $articles sous le nom ‘articles’. Ainsi, nous pourrons parcourir le tableau articles dans notre vue.

La vue

Comme indiqué ci-dessus, notre contrôleur va transmettre les articles à notre vue sous le nom ‘articles’.

Ces données sont fournies sous la forme d’un tableau qui doit donc être parcouru par une boucle.

Le fichier blog.html.twig va donc contenir cette boucle

{% extends "layout.html.twig" %}

{% block content %}
	<h1>Bienvenue sur votre blog</h1>
	{% for ligne in articles %}
		<h2><a href="{{ path('monblog') }}/{{ ligne.id }}">{{ ligne.titre }}</a></h2>
		<p>Publié le {{ ligne.date_article }} par {{ ligne.pseudo }}</p>
		<p>{{ ligne.contenu }}</p>
	{% endfor %}
{% endblock %}
  • {% for ligne in articles %} est le début de la boucle qui va parcourir le tableau « articles » chaque passage correspondra à une « ligne ». La boucle se termine à l’instruction {% endfor %}
  • Le contenu du href sera traité dans un prochain article
  • {{ ligne.titre }} correspond au contenu de l’index « titre » de notre ligne. De manière générale, il s’agit d’une notation {{ligne.index}} pour chacune des données où index correspond aux titres de colonnes.

Voilà, si tout a été suivi à la lettre, vous avez maintenant une page blog fonctionnelle.

Cet article est le 3ème d’une série permettant d’apprendre pas à pas l’utilisation de Silex.

L’article suivant explique la gestion des sessions utilisateurs

Commentaires

Ecrire un commentaire

Pas encore de commentaire

Laisser un commentaire