26/03/2023

0. Installation

Lu 880 fois Licence Creative Commons

Doctrine

Doctrine est un ensemble de librairies principalement orientées sur le sujet des bases de données dont:

Le projet comporte beaucoup d'autres librairies mais nous allons nous intéresser à l'intégration de l'ORM dans Symfony en installant différent bundles.

Concepts

Avec Doctrine, chacune de vos tables en base de données correspond à une entité: une classe PHP dont les propriétés correspondent aux colonnes de la table.
L'objectif est de travailler directement avec les objets, en oubliant presque sa base de données !

Pour récupérer des entités depuis les données en base, on va utiliser des répertoires ("repository"): chaque classe d'entité possède une classe répertoire correspondante, en charge des opérations de lecture.
On peut alors modifier les entités comme bon nous semble.

Toutes les opérations d'écriture (insertion, modification et suppression) sont gérées par l'Entity Manager (le "gestionnaire d'entités"). On l'informera des entités à ajouter en base ou de celles que l'on souhaite supprimer.

Installation

Utilisez l'alias orm pour installer l'ORM ainsi que 2 bundles Doctrine via un pack:

composer req orm

Une question vous sera posée pour savoir si vous souhaitez que doctrinedoctrine-bundle installe une configuration Docker Compose pour la base de données:

[output]Symfony operations: 2 recipes (249451365af05a441bcd65ab3172d200)
[output]  - Configuring doctrine/doctrine-bundle (>=2.4): From github.com/symfony/recipes:main
[output]  -  WARNING  doctrine/doctrine-bundle (>=2.4): From github.com/symfony/recipes:main
[output]    The recipe for this package contains some Docker configuration.
[output]
[output]    This may create/update docker-compose.yml or update Dockerfile (if it exists).
[output]
[output]    Do you want to include Docker configuration from recipes?
[output]    [y] Yes
[output]    [n] No
[output]    [p] Yes permanently, never ask again for this project
[output]    [x] No permanently, never ask again for this project
[output]    (defaults to y):

Si vous acceptez (et que vous avez donc Docker Compose sur votre machine), changez les variables d'environnement du serveur PostgreSQL et indiquez un mapping de ports:

services:
    database:
	    # ...
		environment:
			POSTGRES_PASSWORD: root
			POSTGRES_USER: root
		ports:
		    - "5432:5432"
		# ...

Puis démarrez le serveur:

docker compose up -d

Configuration

Commençons par indiquer la chaîne de connexion au DBAL via la variable d'environnement DATABASE_URL dans le fichier .env sous la forme suivante:

DATABASE_URL="sgbd://utilisateur:mot_de_passe@hote:port/base_de_donnees"

Nous nommerons la base de données sf5_events.

Adaptez la variable selon votre SGBD, identifiants, ... Plusieurs exemples sont à disposition en commentaire.

Nous allons spécifier les informations en query string de serverVersion et charset directement dans la configuration du bundle dans /config/packages/doctrine.yaml:

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        server_version: '15'
        charset: 'utf8'
		# ...

Adaptez selon votre serveur de base de données.
Note: pour indiquer la version d'un serveur MariaDB il faut la préfixer de mariadb- (exemple: mariadb-10.10.3).

Pour tester la configuration au serveur de base de données, créer la base de données à partir de la commande doctrine:database:create:

php bin/console doctrine:database:create
[output]Created database "sf5_events" for connection named default