Comment générer les entités à partir d’une base de données et créer le CRUD automatiquement dans Symfony 5

Il existe une approche très utile pour créer facilement des formulaires pour gérer les enregistrements de votre base de données dans Symfony. Il s’agit de l’approche inverse, où le modèle a déjà été construit, ce serait donc une perte de temps de concevoir les entités à partir de zéro car elles existent déjà.

Dans ce tuto, je vais vous expliquer comment créer facilement les entités de doctrine à partir des tables de votre base de données automatiquement dans Symfony 5.

1) Configurer les informations d’identification de la base de données

La première chose dont vous avez besoin est de configurer la connexion à la base de données dans votre projet. Dans Symfony 5, cela peut être facilement fait via le paramètre DATABASE_URL dans le fichier .env :

# Pour MySQL database
DATABASE_URL=mysql://pseudo:motdepasse@127.0.0.1:3306/DATABASE_NAME?serverVersion=5.7
# Pour PostgreSQL
DATABASE_URL="postgresql://127.0.0.1:5432/db?serverVersion=13&charset=utf8"

Une fois que le projet a accès à la base de données, il devrait maintenant être capable de construire les entités automatiquement.

2) Mainenant on créer les entités automatiquement

Les entités sont des objets avec identité, l’identité a une signification conceptuelle dans votre projet. Par exemple, pour la base de données MySQL que nous utiliserons dans cet article

Nous devrions donc avoir 2 entités. Ils peuvent être générés automatiquement avec la commande Symfony suivante :

php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity

La commande générera les entités à partir des tables de votre base de données au format d’annotation dans le répertoire app/src/Entity, générant la sortie suivante :

Importing mapping information from "default" entity manager
  > writing src/Entity/Person.php
  > writing src/Entity/State.php
Done.

Les entités générées (Entity/Person.php et Entity/State.php) ressembleront à ceci :

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * State
 *
 * @ORM\Table(name="state")
 * @ORM\Entity
 */
class State
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;
}

Ce sont des entités simples sans getters ni setters, donc ce n’est pas terminé pour le moment. Vous devez maintenant exécuter la commande suivante pour générer les getters et setters des entités :

php bin/console make:entity --regenerate App

Cela devrait générer la sortie suivante :

updated: src/Entity/Entite1.php
 updated: src/Entity/Entite2.php

  Success! 

Donc si vous vérifiez maintenant les entités, vous devriez voir les getters et setters de chaque propriété de la classe :

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * State
 *
 * @ORM\Table(name="entite1")
 * @ORM\Entity
 */
class Entite1
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;

    public function getId(): ?string
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }
}

Il est maintenant important de mentionner que dans ce cas, nous avons une relation ManyToOne dans la propriété d’état de l’entité Person. Donc, si vous créez le CRUD pour ces entités, le formulaire pour la personne aura un champ de sélection qui vous permettra de sélectionner un seul état pour stocker l’entité personne. Pour éviter l’erreur : L’objet de la classe \App\Entity\State n’a pas pu être converti en chaîne, vous devez ajouter la méthode magic toString dans la classe d’entité State qui renvoie le nom de l’état qui sera affiché dans le select when la forme existe :

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Entite1
 *
 * @ORM\Table(name="entite1")
 * @ORM\Entity
 */
class State
{
    // ... //
    
    public function __toString() {
        return $this->name;
    }
}

3) Création du CRUD

Enfin, pour créer le CRUD depuis Symfony 5 vous pouvez facilement le faire avec une seule commande, l’instruction make:crud :

php bin/console make:crud

Cela lancera une simple invite qui vous demandera le nom de l’entité que vous essayez d’utiliser pour créer le CRUD. Alternativement, si vous ne voulez pas être invité, mettez simplement le nom de l’entité comme premier argument de position.

Dans notre cas, pour créer le CRUD de l’entité Entité, la commande serait la suivante :

php bin/console make:crud Person

Le générateur CRUD enregistrera automatiquement une route avec le nom de l’entité que vous avez utilisée, un contrôleur qui gérera les bases du crud comme la vue d’index, l’édition, l’affichage et la suppression automatique des formulaires pour vous.