Afin de tirer le maximum de votre API REST, il est essentiel de mettre en place une base de données. Grâce à l’ORM Doctrine, il est possible de créer des entités. Par la suite, le schéma de base de données pourra être créé en fonction de ces entités. Peu importe le système de gestion de base de données utilisé (MySQL, PostGreSQL, MongoDB, SQLite), Doctrine pourra créer le schéma approprié.
Cet article explique comment configurer une base de données pour le cadriciel Symfony 3.
Deux méthodes différentes sont présentées :
- Configurer la base de données à partir des fichiers parameters.yml et config.yml
- Configurer la base de données avec des variables d’environnement, un fichier parameters.php et config.yml.
Installer MySQL
Si ce n’est pas déjà fait, installer MySQL ou un LAMP.
1 2 |
$ apt-cache search ^mysql $ sudo apt-get install mysql-server-5.6 |
Méthode #1 – yml
Configurer la base de données pour Symfony
Afin de pouvoir communiquer avec la base de données, Symfony nécessite d’être configuré. Cette configuration se retrouve dans le fichier config.yml et parameters.yml.
- parameters.yml : vous permet de spécifier des variables pour votre application.
- config.yml : vous permet d’utiliser ces variables pour configurer vos bundles Symfony.
parameters.yml
Voici donc les informations de base nécessaires afin de configurer la base de données :
1 2 3 4 5 6 |
parameters: database_host: 127.0.0.1 database_port: null database_name: symfony database_user: root database_password: null |
config.yml
Les paramètres définis préalablement (parameters.yml) sont maintenant utilisés dans le fichier de configuration. Notez que database_host revient database.host.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
doctrine: dbal: driver: '%database.driver%' host: '%database.host%' port: '%database.port%' dbname: '%database.name%' user: '%database.user%' password: '%database.password%' charset: UTF8 options: 1002: "SET NAMES 'UTF8'" orm: auto_generate_proxy_classes: '%kernel.debug%' auto_mapping: true |
Méthode #2 – php
Une note sur parameters.php
Il est possible d’utiliser le fichier parameters.yml, par contre, il est impossible d’exécuter des commandes PHP dans un fichier YAML.
Dans le très bon article 12 factor app, il est recommandé de ne pas inscrire de mot de passe dans vos fichiers de projet. Cela amène 2 avantages importants :
- Conserve votre mot de passe privé.
- Permet de déployer votre application vers plusieurs environnements sans avoir à modifier le code.
Le truc : les variables d’environnement
Il faut éviter de déposer vos mots de passe dans votre code. Où les mettre alors? La réponse est de déposer vos mots de passe et vos configurations dans des variables d’environnement et de les récupérer avec la commande PHP getenv().
Ajouter des variables d’environnement sur Ubuntu
Vos variables d’environnement pour Ubuntu peuvent être définies dans votre fichier .bashrc.
1 2 |
$ cd $ nano .bashrc |
Ajouter les commandes suivantes dans votre fichier .bashrc :
1 2 3 4 5 6 |
export SYMFONY_BD_HOST="127.0.0.1" export SYMFONY_BD_NAME="nomDeMaBD" export SYMFONY_BD_USER="root" export SYMFONY_BD_PORT="3306" export SYMFONY_BD_PASS="unmotdepassecomplexe" export SYMFONY_BD_DRIVER="pdo_mysql" |
Assurez-vous que les variables sont bien chargées avec la commande env sur GNU-Linux ou set sur Windows.
Variables d’environnement sur GNU-Linux ou MacOs
1 |
$ env | grep SYMFONY |
Variables d’environnement sur Windows
1 |
$ set | findstr SYMFONY |
Consommer les variables d’environnement
Une fois vos variables ajoutées à votre fichier de configuration .bashrc, il sera possible de les consommer dans votre fichier parameters.php nouvellement créé de la manière suivante :
parameters.php
1 2 3 4 5 6 7 |
<?php $container->setParameter('database_driver', getenv('SYMFONY_BD_DRIVER')); $container->setParameter('database_host', getenv('SYMFONY_BD_HOST')); $container->setParameter('database_port', getenv('SYMFONY_BD_PORT')); $container->setParameter('database_name', getenv('SYMFONY_BD_NAME')); $container->setParameter('database_user', getenv('SYMFONY_BD_USER')); $container->setParameter('database_password', getenv('SYMFONY_BD_PASS')); |
Importer le fichier parameters.php
La dernière étape, pour utiliser le fichier parameters.php, est de modifier le fichier config.yml afin de charger cette nouvelle ressource :
1 2 3 |
imports: - { resource: parameters.yml } - { resource: parameters.php } |
Créer une nouvelle base de données
La section suivante présente 3 façons de créer une nouvelle base de données pour votre projet Symfony. La première, avec la console Symfony, est celle recommandée.
1) Avec la console Symfony
La console Symfony est, selon moi, la façon la plus efficace afin de créer la nouvelle base de données.
1 |
$ bin/console doctrine:database:create |
2) En ligne de commande
L’option ligne de commande MySQL est aussi possible, par contre, si vous utilisez SQLite ou PostGreSQL, les commandes seront différentes.
1 2 |
$ mysql -h host -u user -p menagerie $ mysql> CREATE DATABASE nomDeLaBD; |
3) Avec MySQL Workbench
Afin de compléter cette tâche, il est aussi possible d’utiliser MySQL-Workbench, un outil multi-plateforme qui permet l’administration de vos bases de données MySQL en local ou à distance. MySQL Workbench vous offre aussi une option de modélisation et d’ingénierie inverse (créer un schéma à partir d’une base de données existante). C’est un très bon logiciel que je recommande même si ce n’est pas l’option idéale pour créer votre base de données.
1 |
$ sudo apt-get install mysql-workbench |
Quelques commandes utiles pour MySQL
Si tout ne tourne pas rond avec MySQL, voici quelques commandes utiles à utiliser sur Ubuntu :
Se connecter à MySQL
1 |
$ mysql -h host -u user -p monNomDeBD |
Lancer MySQL
1 |
$ sudo start mysql |
Arrêter MySQL
1 |
$ sudo stop mysql |
Vérifier l’état du serveur MySQL
1 |
$ sudo status mysql |
Vérifier la présence du processus mysqld en mémoire
1 |
$ ps -aux | grep mysqld |
Créer une entité Doctrine
Une fois le serveur de base de données configuré et fonctionnel, vous pouvez vous amuser avec la console Symfony pour Doctrine. Cette console vous donne un accès rapide à un tas de commandes utiles pour développer efficacement votre application web.
Excellent tutoriel
Twig est extensible – Twig propose de base un certain nombre de fonctionnalites recurrentes que vous etes en droit d attendre d un moteur de template, mais pour les situations ou vous pourriez avoir des besoins specifiques, il est facile d etendre Twig.
Bonjour,
Je trvaille avec Symfony 3 .
J’ai fait les configuration pour créer une base de donnée mais cela me génère toujours des erreurs que voici:
Merci d’avance pour aide.
[Doctrine\DBAL\Exception\ConnectionException]
An exception occured in driver: SQLSTATE[HY000] [1045] Access denied for us
er ‘root’@’localhost’ (using password: NO)
[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using pas
sword: NO)
[PDOException]
SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using pas
sword: NO)
Bonjour Guillaume,
Le message indique qu’il est impossible pour doctrine de se connecter à la BD avec les accès fournis.
Test proposé : vérifier que tu peux te connecter directement avec la ligne de commande mysql ou un client graphique.
mysql -h host -u user -p monNomDeBD
Tu peux aussi utiliser un client graphique comme https://www.webyog.com/ ou https://www.mysql.fr/products/workbench/.
Ils te permettront de voir les bases de données gérées par MySQL et de vérifier que tes accès sont fonctionnels.
Laisse-moi savoir si ça fonctionne!
Bon succès,
Guillaume
Merci pour votre aide .
J’ai exécuté la première commande cela me met aussi error
mysql -h host -u root -p symfony
Enter password:
ERROR 2005 (HY000): Unknown MySQL server host ‘host’ (0)
Bonjour Guillaume,
Attention, host signifie « nom de l’hôte », en fait, c’est l’adresse IP du serveur de la base de données MySQL.
Si le serveur est installé sur votre poste, il est possible d’utiliser localhost ou 127.0.0.1
J’ai MySQL Workbench ,
Est ce seulement aux bases de bonnée générées par MySQL je pourrai se conneter ?
Bonjour Guillaume,
MySQL Workbench est utilisé pour MySQL.
D’autres outils sont disponibles pour les bases de données PostGreSQL, Oracle ou Microsoft SQL Server.
Je demeure disponible pour répondre à vos question.
Bonjour,
Merci pour ces explications claires. Je rencontre un souci d’ncoage utf8 quand je fais une recherche sur une chaine qui contient par exemple un accent avec Postgresql. Même en ajoutant l’option sur config.yml.
options:
1002: « SET NAMES ‘UTF8′ »
Penses tu savoir d’où ça peut venir ? (Sachant que Postgres est bien en UTF_8).
Merci
Bonjour Farid,
Merci pour tes commentaires!
Concernant ton problème UTF-8, je te propose de vérifier que toutes les fonctions PHP utilisées supportent bien le UTF-8. Voir MbString (http://php.net/manual/en/intro.mbstring.php)
Tu pourrais aussi te connecter directement à Postgres avec PgAdmin (https://www.pgadmin.org/) et lancer ta requête (sans passer par PHP) afin de t’assurer que le problème est bien du côté de PHP.
J’attends de tes nouvelles!
Guillaume