Les Fixtures dans Symfony 6 permettent d’avoir rapidement des données de test pendant le développement d’une application Symfony. C’est données que nous allons générées seront de fausses données créer à l’aide de Faker ainsi nous pourront rapidement avoir de fausses données pour l’application.
Prérequis :
Utilisation des Fixtures avec Symfony 6 :
Avant de commencer à utiliser les Fixtures dans Symfony 6, nous allons d’abord créer une nouvelle application avec une entité Article qui va nous permettre d’utiliser les Fixtures.
Création du nouveau projet :
Pour créer un nouveau projet Symfony 6, nous allons exécuter la commande suivant :
symfony new projet_fixtures --webapp
Ensuite on va pouvoir se rendre dans le dossier de nôtre nouveau projet :
cd projet_fixtures
Puis ensuite nous allons pouvoir modifier le fichier .env afin de connecter l’ORM Doctrine à notre base de données :
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_fixtures?serverVersion=mariadb-10.5.15&charset=utf8mb4"
Une fois connecté à la base de données, depuis la CLI Symfony, nous pouvons créer la base de données :
symfony console d:d:c
Création de l’entité Article :
Pour créer l’entité article, si vous avez besoin de plus de détails, je vous invite à suivre cette procédure : Symfony 6 Créer une entité
Pour créer l’entité Article nous allons saisir la commande suivant :
symfony console make:entity Article
# ou avec l'alias suivant :
symfony console m:e Article
Article(id, date_publication, titre, contenu)
- id: int
- date_publication : Date
- titre : String (50)
- contenu : Text
Ensuite il faut répondre au questionnaire du script comme ci-dessous :
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]:
>
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 nous pouvons faire la migration de doctrine :
symfony console make:migration
Puis ensuite on migre les données :
symfony console d:m:m
Fixtures avec Symfony 6 :
Nous allons importer ce bundle dans notre projet mais sans l’avoir en version de production car il nous sera utile durant la période de développement de l’application.
composer require --dev orm-fixtures
Nous allons également importer Faker qui va nous servir à utiliser de fausses données lors de l’étape de développement :
composer require --dev fakerphp/faker
Après avoir effectuer ces opérations, une nouvelle classe a été crée à l’emplacement : src/DataFixtures/AppFixtures.php
<?php
namespace App\DataFixtures;
use Faker\Factory;
use Faker\Generator;
use App\Entity\Article;
use Doctrine\Persistence\ObjectManager;
use Doctrine\Bundle\FixturesBundle\Fixture;
class AppFixtures extends Fixture
{
/**
* @var Generator
*/
private Generator $faker;
public function __construct()
{
$this->faker = Factory::create('fr_FR');
}
public function load(ObjectManager $manager): void
{
// Création d'une boucle qui va créer 50 articles aléatoires
// Chaque article aura un titre, un contenu, une date de publication qui seront générés aléatoirement
for ($i=1; $i <= 50; $i++) {
$article = new Article();
$article->setTitre($this->faker->sentence(4))
->setContenu($this->faker->paragraph)
->setDatePublication($this->faker->dateTimeBetween('-6 months'));
$manager->persist($article);
}
$manager->flush();
}
}
Et pour générer l’envoie des données sur l’application, nous devons exécuter la commande suivante :
symfony console doctrine:fixtures:load
Ou de manière plus courte
symfony console d:f:l
Voici ci-dessous une image du résultat final :
Sources :
https://symfony.com/bundles/DoctrineFixturesBundle/current/index.html
https://fakerphp.github.io/