Gestion des données¶
Introduction¶
Nous avons vu dans la documentation précédente comment gérer une page avec un controller et un formulaire en méthode POST. La suite logique est de comprendre comment gérer les données dans une base de données.
PHP Data Objects (PDO)
PDO est un moyen de communiquer de manière efficace avec une base de données en PHP, tout en gardant la flexibilité de changer de type de base de données si nécessaire, sans avoir à réécrire votre code.
Pour plus d'informations sur l'objet PDO, vous pouvez consulter la documentation officielle.
Prérequis¶
Vous devez activer le service DatabaseService pour utiliser une base de données MySQL, MariaDB ou SQLite.
Lecture obligatoire
Vous devez avoir lu la documentation sur la DatabaseService : La gestion des données
L'activation du service DatabaseService s'oppère dans le fichier .env de votre projet.
Schéma de la base de données¶
Pour cet exemple, nous allons utiliser une base de données avec une table ville
qui contient les champs suivants :
Jeu de donnée pour les bases Mysql/Sqlite
INSERT INTO ville (nom, code_postal, nombre_habitant) VALUES ('Paris', '75000', 2200000);
INSERT INTO ville (nom, code_postal, nombre_habitant) VALUES ('Marseille', '13000', 800000);
INSERT INTO ville (nom, code_postal, nombre_habitant) VALUES ('Lyon', '69000', 500000);
Création de l'entité Ville et de la couche modèle (Repository)¶
Nous allons reprendre la page sur Construire un formulaire
Voici l'arborecence actuelle de notre projet :
├── app
│ ├── Config
│ │ └── routes.yaml
│ ├── Controller
│ │ └── VilleController.php
│ └── Template
│ ├── base.html.twig
│ └── ville
│ └── ville.html.twig
Nous allons ajouter deux dossiers dans le dossier app
pour gérer les données :
Entity
: pour les entités (classes qui représentent les données de la base de données)Repository
: pour les classes qui permettent de récupérer les données de la base de données
├── app
│ ├── Config
│ │ └── routes.yaml
│ ├── Controller
│ │ └── VilleController.php
│ ├── Entity
│ │ └── Ville.php
│ ├── Repository
│ │ └── VilleRepository.php
│ └── Template
│ ├── base.html.twig
│ └── ville
│ └── ville.html.twig
Selon le schéma de la base de données, nous allons créer une entité Ville
et un repository VilleRepository
.
Création de l'entité Ville¶
Nous allons créer une entité Ville
dans le dossier app/Entity
.
<?php
namespace Entity;
class Ville
{
private int $id;
private string $nom;
private string $code_postal;
private int $nombre_habitant;
public function __construct($id, $nom, $code_postal, $nombre_habitant)
{
$this->id = $id;
$this->nom = $nom;
$this->code_postal = $code_postal;
$this->nombre_habitant = $nombre_habitant;
}
public function getId()
{
return $this->id;
}
public function getNom()
{
return $this->nom;
}
public function getCodePostal()
{
return $this->code_postal;
}
public function getNombreHabitant()
{
return $this->nombre_habitant;
}
}
Création du repository VilleRepository¶
Nous allons créer un repository VilleRepository
dans le dossier app/Repository
.
<?php
namespace Repository;
use Entity\Ville;
use Studoo\EduFramework\Core\Service\DatabaseService;
class VilleRepository
{
public function getVilles(): array
{
$villes = [];
$DataService = DatabaseService::getConnect();
$stmt = $DataService->query('SELECT * FROM ville');
while ($row = $stmt->fetch()) {
$villes[] = new Ville($row['id'], $row['nom'], $row['code_postal'], $row['nombre_habitant']);
}
return $villes;
}
}
Modification du controller VilleController¶
Nous allons modifier le controller VilleController
pour récupérer les données de la base de données.
<?php
namespace Controller;
+ use Repository\VilleRepository;
use Studoo\EduFramework\Core\Controller\ControllerInterface;
use Studoo\EduFramework\Core\Controller\Request;
use Studoo\EduFramework\Core\View\TwigCore;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class VilleController implements ControllerInterface
{
public function execute(Request $request): string|null
{
return TwigCore::getEnvironment()->render('ville/ville.html.twig',
[
"titre" => 'VilleController',
"request" => $request,
"add_ville" => $request->get('nom_ville'),
+ "villes" => (new VilleRepository())->getVilles()
]
);
}
}
Modification de la vue ville.html.twig¶
Nous allons modifier la vue ville.html.twig
pour afficher les données de la base de données.
{% extends "base.html.twig" %}
{% block title %}{{ titre }}{% endblock %}
{% block content %}
<h1>{{ titre }}</h1>
{% if add_ville is not null %}
<div class="alert alert-success" role="alert">
La ville est {{ add_ville }}
</div>
{% endif %}
<p>Créer une nouvelle ville</p>
<form action="{{ getNameToPath('ville') }}" method="post">
<label for="nom_ville">Ville</label>
<input type="text" id="nom_ville" name="nom_ville">
<input type="submit" value="Envoyer">
</form>
+ <h2>Liste des villes</h2>
+ <ul>
+ {% for ville in villes %}
+ <li>{{ ville.getNom() }} ({{ ville.getCodePostal() }}) - {{ ville.getNombreHabitant() }} habitants</li>
+ {% endfor %}
+ </ul>
{% endblock %}