12/02/2023

3. Fixtures

Lu 609 fois Licence Creative Commons

L'entité est générée et la table en base de données est créée grâce à la migration. Mais pour l'instant il n'y a aucune donnée.
Plutôt que de générer manuellement des données, nous allons automatiser le processus en rédigeant des fixtures !

Inutiles en production puisque vous disposerez des véritables données, les fixtures permettent de générer rapidement un large volume de données et donc simuler un environnement de production lors du développement.

Installation de hautelook/alice-bundle

Doctrine propose un bundle doctrine/doctrine-fixtures-bundle pour générer des fixtures écrites en PHP mais d'autres solutions basées sur le système de Doctrine existent. Nous allons utiliser hautelook/alice-bundle qui est basé sur plusieurs autres librairies.

Commençons par installer le composant PropertyAccess:

composer req symfony/property-access

Puis l'activer dans /config/packages/framework.yaml:

framework:
    # ...
    property_access:
        enabled: true

Enfin, installer le bundle:

composer req --dev hautelook/alice-bundle

Celui-ci va se charger de la partie base de données, et se baser sur nelmio/alice qui permet d'écrire nos fixtures en YAML. Pour avoir des données aléatoires, on va pouvoir exécuter les fonctions de Faker.

Configurez la langue utilisée par Faker en modifiant la configuration du NelmioAliceBundle dans /config/packages/nelmio_alice.yaml:

when@dev: &dev
    nelmio_alice:
	    # Faker génèrera des informations en français lorsque c'est possible
        locale: 'fr_FR'
		# ...

Rédaction des premières fixtures

On souhaite générer 50 événements avec des informations aléatoires. Créez un fichier /fixtures/event.yaml.
On rappelle d'abord le nom de la classe:

App\Entity\Event:

Puis une clé correspondant à l'objet généré. Pour éviter de dupliquer notre bloc 50 fois, on va utiliser la syntaxe {premier..dernier}:

App\Entity\Event:
    # de "event_1" à "event_50"
    event_{1..50}:

Enfin, on indique les valeurs pour chacune des propriétés de l'entité:

App\Entity\Event:
    event_{1..50}:
	    # On appelle une fonction de Faker sous la forme <fonction()>
		# Voir par exemple https://fakerphp.github.io/formatters/miscellaneous/#currencycode
        title: '<currencyCode()> <safeColorName()> <randomDigit()>'
		# Ici la description a 75% de chance d'être spécifiée
        description: '75%? <realText()>'
		# On peut passer des paramètres aux fonctions
        startAt: '<dateTimeBetween("-3 month", "+6 month")>'
		# Et réutiliser les valeurs des autres propriétés comme paramètres d'autres fonctions
        endAt: '<dateTimeInInterval($startAt, "+1 week")>'

Chargement des fixtures

On lance la génération des fausses données:

php bin/console hautelook:fixtures:load
[output]Careful, database will be purged. Do you want to continue y/N ?y

La base va être "purgée": les anciennes données seront supprimées. Relancez la commande pour repartir sur un nouveau jeu de données.
Observez le résultat en base de données:

id title description start_at end_at
1 MOP noir 7 NULL 2023-08-11 02:58:55 2023-08-17 04:54:12
2 PKR blanc 8 NULL 2023-07-19 08:17:57 2023-07-23 14:03:48
3 CLP bleu 6 Et il descendit con... 2022-11-28 19:52:36 2022-11-29 15:47:42
4 OMR fuschia 4 Breda- street, et Je... 2023-06-01 12:10:53 2023-06-03 15:10:33
... ... ... ... ...