6 - Optimisation des entités et DataFixtures (Symfony 6)

Catégories : Symfony

Série : Symfony 6

Fichiers : https://github.com/NouvelleTechno/e-commerce-Symfony-6

Mots-clés : Symfony datafixtures entites symfony6 entity traits

1463 lectures

Auteur : user Benoit

Date :

Partager

Partager sur Facebook Partager sur Twitter Partager sur LinkedIn

Dans cette 6ème vidéo de la série, nous allons optimiser les entités et générer du contenu de test au moyen des DataFixtures.

Optimisation des entités

Les entités que nous avons créées contiennent des informations redondantes qui peuvent être optimisées. nous allons également ajouter des slugs dans les entités qui peuvent le nécessiter.

Les redondances

Nous retrouvons différentes propriétés identiques dans différentes entités, comme created_at par exemple, qui se trouve dans les entités Users, Products, Orders et Coupons. On y trouve également à chaque fois les accesseurs getCreatedAt et setCreatedAt.

Nous aurons la possibilité de limiter ces redondances en sortant ce code dans un Trait.

Nous allons donc créer un dossier Trait dans src/Entity, et créer un fichier CreatedAtTrait.php à l'intérieur.

Ce fichier contiendra la propriété created_at et les accesseurs sous cette forme

<?php

namespace App\Entity\Trait;

use Doctrine\ORM\Mapping as ORM;

trait CreatedAtTrait
{
    #[ORM\Column(type: 'datetime_immutable', options: ['default' => 'CURRENT_TIMESTAMP'])]
    private $created_at;

    public function getCreatedAt(): ?\DateTimeImmutable
    {
        return $this->created_at;
    }

    public function setCreatedAt(\DateTimeImmutable $created_at): self
    {
        $this->created_at = $created_at;

        return $this;
    }
}

Nous allons ensuite modifier les entités en supprimant la propriété et les accesseurs et en ajoutant une ligne en début de classe comme ci dessous (attention, il s'agit d'un fichier partiel de la classe Products)

<?php

namespace App\Entity;

use App\Entity\Trait\CreatedAtTrait;
use App\Entity\Trait\SlugTrait;
use App\Repository\ProductsRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ProductsRepository::class)]
class Products
{
    use CreatedAtTrait;
    
    // ... Suite du fichier
}

On procédera de même pour ajouter les propriétés slug.

Mise en place des DataFixtures

Pour pouvoir générer des données exemple pour la base de données, nous allons installer le composant orm-fixtures dans notre projet au moyen de la commande suivante

composer require --dev orm-fixtures

Ce composant a créé un dossier DataFixtures dans src.

Afin de générer du contenu aléatoire, nous allons installer le composant fakerphp au moyen de la commande

composer require fakerphp/faker

Création des Fixtures

Pour créer une Fixture, nous pouvons utiliser le maker bundle au moyen de la commande ci-dessous (pour créer CategoriesFixtures)

symfony console make:fixtures CategoriesFixtures

Cette commande crée le fichier src/DataFixtures/CategoriesFixtures.php

Le fichier est créé avec ce contenu

<?php

namespace App\DataFixtures;

use App\Entity\Categories;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\String\Slugger\SluggerInterface;

class CategoriesFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        // $product = new Product();
        // $manager->persist($product);
                
        $manager->flush();
    }
}

Nous allons le modifier pour créer des catégories

<?php

namespace App\DataFixtures;

use App\Entity\Categories;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\String\Slugger\SluggerInterface;

class CategoriesFixtures extends Fixture
{
    private $counter = 1;

    public function __construct(private SluggerInterface $slugger){}

    public function load(ObjectManager $manager): void
    {
        $parent = $this->createCategory('Informatique', null, $manager);
        
        $this->createCategory('Ordinateurs portables', $parent, $manager);
        $this->createCategory('Ecrans', $parent, $manager);
        $this->createCategory('Souris', $parent, $manager);

        $parent = $this->createCategory('Mode', null, $manager);

        $this->createCategory('Homme', $parent, $manager);
        $this->createCategory('Femme', $parent, $manager);
        $this->createCategory('Enfant', $parent, $manager);
                
        $manager->flush();
    }

    public function createCategory(string $name, Categories $parent = null, ObjectManager $manager)
    {
        $category = new Categories();
        $category->setName($name);
        $category->setSlug($this->slugger->slug($category->getName())->lower());
        $category->setParent($parent);
        $manager->persist($category);

        $this->addReference('cat-'.$this->counter, $category);
        $this->counter++;

        return $category;
    }
}

Nous utiliserons la méthode addReference pour mémoriser les catégories et les réutiliser dans d'autres Fixtures.

Pour plus d'informations concernant les autres DataFixtures, merci de voir la vidéo.

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Guilded pour une entraide par chat.