6 - Optimisation des entités et DataFixtures (Symfony 6)
Par Nouvelle-Techno.fr le 25 février 2022 - Catégories : Symfony
Lire l'article sur le site d'origine
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 Discord pour une entraide par chat.