Doctrine et Symfony

ORM Doctrine

ORM

ORM signifie Object-Relationnal Mapper. Un ORM sert à offrir une couche d’abstraction de connexion à toutes les BD relationnelles (comme PDO) mais aussi des facilités pour réaliser les requêtes courantes sans descendre au niveau des requêtes SQL et pour générer automatiquement des entités dans le langage utilisé avec les getters et setters correspondants.

installation

Il suffit de taper :

composer req orm

pour disposer de l’installation de l’ORM standard de Symfony qui est Doctrine Voir sa documentation

symfony maker-bundle

Il permet de fabriquer des entités, des contrôleurs, des CRUD, des tests etc.

installation

composer req maker-bundle --dev

sous-commandes disponibles

php bin/console list make

ce qui donne :

Symfony 5.0.7 (env: dev, debug: true)

Usage:
command [options] [arguments]

Options:
-h, --help            Display this help message
-q, --quiet           Do not output any message
-V, --version         Display this application version
    --ansi            Force ANSI output
    --no-ansi         Disable ANSI output
-n, --no-interaction  Do not ask any interactive question
-e, --env=ENV         The Environment name. [default: "dev"]
    --no-debug        Switches off debug mode.
-v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands for the "make" namespace:
make:auth                   Creates a Guard authenticator of different flavors
make:command                Creates a new console command class
make:controller             Creates a new controller class
make:crud                   Creates CRUD for Doctrine entity class
make:entity                 Creates or updates a Doctrine entity class, and optionally an API Platform resource
make:fixtures               Creates a new class to load Doctrine fixtures
make:form                   Creates a new form class
make:functional-test        Creates a new functional test class
make:message                Creates a new message and handler
make:messenger-middleware   Creates a new messenger middleware
make:migration              Creates a new migration based on database changes
make:registration-form      Creates a new registration form system
make:reset-password         Create controller, entity, and repositories for use with symfonycasts/reset-password-bundle.
make:serializer:encoder     Creates a new serializer encoder class
make:serializer:normalizer  Creates a new serializer normalizer class
make:subscriber             Creates a new event subscriber class
make:twig-extension         Creates a new Twig extension class
make:unit-test              Creates a new unit test class
make:user                   Creates a new security user class
make:validator              Creates a new validator and constraint class
make:voter                  Creates a new security voter class

Entités

Créons une entité Personne de ce type :

_images/personne-entity.png
php bin/console make:entity
  • Répondez aux questions pour ajouter des champs nom et prenom de type string dans Personne.

  • Vérifiez la création du code correspondant dans src/Entity.

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="App\Repository\PersonneRepository")
*/
class Personne
{
    /**
    * @ORM\Id()
    * @ORM\GeneratedValue()
    * @ORM\Column(type="integer")
    */
    private $id;

    /**
    * @ORM\Column(type="string", length=255)
    */
    private $nom;

    /**
    * @ORM\Column(type="string", length=255)
    */
    private $prenom;

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

    public function getNom(): ?string
    {
        return $this->nom;
    }

    public function setNom(string $nom): self
    {
        $this->nom = $nom;

        return $this;
    }

    public function getPrenom(): ?string
    {
        return $this->prenom;
    }

    public function setPrenom(string $prenom): self
    {
        $this->prenom = $prenom;

        return $this;
    }
}

Config

Réglons la configuration de la base dans .env sur SQLite:

###> doctrine/doctrine-bundle ###
DATABASE_URL=sqlite:///%kernel.project_dir%/var/carnet.db?charset=utf8mb4
###< doctrine/doctrine-bundle ###

Interaction avec la BD

Initialisons la base :

./bin/console doctrine:database:create
./bin/console doctrine:schema:update --force

easy_admin

Pour faciliter l’interaction avec la BD, installons easy_admin :

composer req admin

Puis visitez : localhost:8000/admin

Nous obtenons une erreur, complétons donc config/packages/easy_admin.yaml :

easy_admin:
    entities:
    # List the entity class name you want to manage
        - App\Entity\Personne

et vous pourrez ensuite ajouter facilement des personnes dans l’admin !

générateur de CRUD

Nous aurions pu aussi utiliser le générateur de CRUD :

php bin/console make:crud

en choisissant l’entité Personne.

Cela fabrique automatiquement un CRUD avec le contrôleur et les templates nécessaires. Intéressant pour inspecter le code généré même si visuellement easy_admin est plus abouti …

profiler

Puis installons la barre du profiler :

composer req profiler

Pour tester le CRUD et le profiler : localhost:8000/personne

On obtient :

_images/Profiler.png

debug des routes

On peut lister toutes les routes :

php bin/console debug:router

et obtenir en particulier :

Name

Method

Scheme

Host

Path

personne_index

GET

ANY

ANY

/personne/

personne_new

GET|POST

ANY

ANY

/personne/new

personne_show

GET

ANY

ANY

/personne/{id}

personne_edit

GET|POST

ANY

ANY

/personne/{id}/edit

personne_delete

DELETE

ANY

ANY

/personne//{id}

easyadmin

ANY

ANY

ANY

/admin

sécurité

On peut utiliser le security-checker pour vérifier tous les bundles installés :

composer require sec-checker --dev