Une entité dans Symfony 6 est une classe qui représente un objet. Dans cette procédure on va utiliser l’ORM (Mapping objet-relationnel) Doctrine qui va permettre de lier les données de la base de données aux entités. Dans cette procédure, nous allons voir comment créer une entité dans Symfony 6, la lié a une base de données et utilisé l’entité.
Prérequis :
- Une machine qui possède Symfony 6
Créer une entité dans Symfony 6 :
Avant de créer l’entité, on va d’abord créer un nouveau projet Symfony 6
symfony new --webapp projet_entitee
Ensuite on se rend dans le dossier du projet
cd projet_entitee
Ouvrir le projet avec un IDE, je vous conseil VScode car vous pouvez vous éditer votre projet à l’aide de l’extension « Explorateur Distant » qui utilise le SSH.
On va installer MariaDB comme SGBD et créer un compte utilisateur « symfony » à l’aide de la procédure de création de serveur Lamp.
En exécutant les lignes de commandes présentes dans la catégorie Installation et MariaDB.
Puis ensuite on va installer PhpMyAdmin pour administrer et contrôler les données, en exécutant les commandes de la catégorie PhpMyAdmin.
Créer une base de données « projet_entitee ».
Configurer l’accès à la base de données dans le fichier .env, il faut choisir une ligne qui commence par DATABASE_URL et qui contient le nom du SGBD utilisé
Vous allez avoir besoin des informations :
- Nom d’utilisateur de la base de données
- Mot de passe de la base de données
- Nom de la base de données
- Version de la base de données
Pour obtenir la version de la base données, vous pouvez l’obtenir depuis PhpMyAdmin sur la page d’accueil une fois connecté :
DATABASE_URL="mysql://nom_utilisateur:mot_de_passe@127.0.0.1:3306/nom_bdd?serverVersion=version_mariadb&charset=utf8mb4"
avec mes valeurs
DATABASE_URL="mysql://symfony:password@127.0.0.1:3306/projet_entitee?serverVersion=mariadb-10.5.15&charset=utf8mb4"
Puis dans Symfony nous allons créer une entité de test qui aura la structure suivante en base de données :
Article(id, date_publication, titre, contenu)
- id: int
- date_publication : Date
- titre : Varchar (50)
- contenu : Text
La clé primaire id va être créer automatiquement donc il ne faudra pas la créer dans console Symfony.
Création de l’entité avec la commande :
symfony console make:entity
Class name of the entity to create or update (e.g. GrumpyPizza):
> Article
created: src/Entity/Article.php
created: src/Repository/ArticleRepository.php
Entity generated! Now let's add some fields!
You can always add more fields later manually or by re-running this command.
New property name (press <return> to stop adding fields):
> date_publication
Field type (enter ? to see all types) [string]:
> date
Can this field be null in the database (nullable) (yes/no) [no]:
> no
updated: src/Entity/Article.php
Add another property? Enter the property name (or press <return> to stop adding fields):
> titre
Field type (enter ? to see all types) [string]:
> string
Field length [255]:
> 50
Can this field be null in the database (nullable) (yes/no) [no]:
> no
updated: src/Entity/Article.php
Add another property? Enter the property name (or press <return> to stop adding fields):
> contenu
Field type (enter ? to see all types) [string]:
> text
Can this field be null in the database (nullable) (yes/no) [no]:
> no
updated: src/Entity/Article.php
Add another property? Enter the property name (or press <return> to stop adding fields):
>
Success!
Next: When you're ready, create a migration with php bin/console make:migration
Ensuite on peut créer une migration Symfony :
symfony console make:migration
Si la migration affiche ce message alors vous pouvez continuer
Ensuite migrer les informations :
symfony console doctrine:migrations:migrate
# ou avec
symfony console d:m:m
Remplir la base de données de données :
Il est possible de remplir votre base de données à l’aide de plusieurs moyens :
- Manuellement depuis PhpMyAdmin ou votre base de données
- Automatiquement avec des Fixtures
Dans cette procédure, nous allons ajouter les données directement dans la base de données.
La première étape est de se rendre dans PhpMyAdmin puis dans la base de données lié au projet Symfony.
Ensuite on se rende dans la table qui possède le nom de l’entité que nous avons crée dans Symfony.
- 1 : Choisir la section insérer
- 2 : Remplir les données
- 3 : Valider l’insertion de données en cliquant sur le bouton insérer
Création d’un Controller pour traiter les données
Si vous ne savez pas ce qu’est un Controller, je vous invite à aller voir ma procédure sur les controller Symfony avant de continuer.
Création du Controller :
symfony console make:controller
Récupérer les données de la base de données :
Ensuite il faut se rendre dans fichier qui se trouver dans l’emplacement src/Controller/ArticleController.php pour le modifier.
Nous allons créer la route /articles qui va nous retourner tous les articles :
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ArticleRepository;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'app_list_articles')]
public function index(ArticleRepository $articleRepository): Response
{
$articles = $articleRepository->findAll();
dd($articles);
return $this->render('article/index.html.twig', [
'articles' => $articles,
]);
}
}
Nous allons aussi créer la route qui va récupérer uniquement un article a l’aide de son id.
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ArticleRepository;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'app_list_articles')]
public function index(ArticleRepository $articleRepository): Response
{
$articles = $articleRepository->findAll();
dd($articles);
return $this->render('article/index.html.twig', [
'articles' => $articles,
]);
}
#[Route('/article/{id}', name: 'app_show_article')]
public function showArticle(int $id, ArticleRepository $articleRepository): Response
{
$article = $articleRepository->find($id);
dd($article);
return $this->render('article/show.html.twig', [
'article' => $article,
]);
}
}
Ajouter des données en base de données :
Nous allons créer une route avec la forme /article/add qui va créer un article (statique).
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\ArticleRepository;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
class ArticleController extends AbstractController
{
#[Route('/articles', name: 'app_list_articles')]
public function index(ArticleRepository $articleRepository): Response
{
$articles = $articleRepository->findAll();
dd($articles);
return $this->render('article/index.html.twig', [
'articles' => $articles,
]);
}
#[Route('/article/add', name: 'app_add_article')]
public function addArticle(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitre('Titre de l\'article');
$article->setContenu('Contenu de l\'article');
$article->setDatePublication(new \DateTime());
$em->persist($article);
$em->flush();
die();
return $this->render('article/add.html.twig');
}
#[Route('/article/{id}', name: 'app_show_article')]
public function showArticle(int $id, ArticleRepository $articleRepository): Response
{
$article = $articleRepository->find($id);
dd($article);
return $this->render('article/show.html.twig', [
'article' => $article,
]);
}
}
Sources :
https://symfony.com/doc/current/doctrine.html