Symfony 5.1 - PDOConnection could not find driver
Bonjour,
Pratiquant Symfony depuis sa version 2, je n'ai jamais rencontré de problème de création de base via doctrine.
Aujourd'hui je veux mener cette opération sur l'environnement le plus récent qui soit :
Windows 10 / Apache 2.4 / Php 7.4 / MySql 8.0.22 / Symfony 5.1.8
et en passant la commande php bin/console doctrine:database:create, j'obtiens l'erreur :
Citation:
In AbstractMySQLDriver.php line 110:
An exception occurred in driver: could not find driver
In PDOConnection.php line 31:
could not find driver
In PDOConnection.php line 27:
could not find driver
Côté environnement,
- mes serveurs Apache et MySql sont bien démarrés (j'accède à MySql en localhost port 3306 par Phpmyadmin avec user=root / pwd=root)
- dans php.ini, j'ai bien extension=pdo_mysql et extension=mysqli décommentés, ce que confirment un php -m, ainsi qu'un phpinfo().
- dans le .env de Symfony, j'ai la ligne DATABASE_URL="mysql://root:root@127.0.0.1:3306/symerp?serverVersion=8.0.22" (sur ce dernier point, j'ai essayé en remplaçant 127.0.0.1 par localhost, sans succès. J'ai aussi essayé avec ou sans " autour de l'url, idem pas de différence)
- Par sécurité, j'ai rajouté ensuite dans doctrine.yaml :
Code:
1 2 3 4 5
| dbal:
# configure these for your database server
driver: 'pdo_mysql'
charset: utf8mb4
url: '%env(resolve:DATABASE_URL)%' |
Mais ça n'a toujours pas résolu le problème.
Les dizaines de posts que j'ai pu consulter sur le sujet ont tous comme réponse "vérifiez que l'extension pdo_mysql est activée", ce qui est fait bien sur. Mais in fine, aucun de ces posts n'indique que le problème a été résolu.
Quelqu'un a-t-il une autre piste ?
Merci par avance
Auto réponse à ce problème
Bonjour,
Après avoir fouillé les arcanes les plus profondes de PHP, j'ai fini par trouver la solution à ce problème pour le cas où quelqu'un le rencontre.
La commande php bin/console doctrine:database:create s'exécute en mode CLI de PHP, et non pas à travers l'instance PHP configurée dans le httpd.conf d'Apache.
Mais il se trouve que la console symfony lancée en CLI ne sait pas localiser toute seule le php.ini si elle n'est pas lancée depuis une fenêtre de commande ouverte depuis le répertoire même où se trouve ce PHP.ini.
La doc PHP sur les différentes localisations possibles que va parcourir successivement le CLI pour trouver son PHP.ini indique qu'à défaut d'être effectivement dans le répertoire de php, d'avoir mis ce php.ini dans c:\windows ou dans des clés de registres, le seul moyen de l'informer de la localisation précise est de créer une variable d'environnement très précise en plus du PATH classique. Cette variable est PHPRC avec comme paramètre le répertoire de php.ini (juste le répertoire, pas besoin de terminer par php.ini en plus).
Comme c'est une variable d'environnement système, il faut rebooter pour que ça prenne effet, mais ensuite la console doctrine fonctionne.
Symfony propose un utilitaire qui m'a permis d'investiguer pour trouver la solution : c'est un petit exe qui permet de mettre à disposition de windows une ligne de commande symfony. Il suffit ensuite d'ouvrir une fenêtre de commande et de taper symfony check:requirements. Le résultat indique non seulement si l'environnement est OK pour utiliser symfony, mais surtout le chemin complet du php.ini analysé.
Dans mon cas c'était autre chose ...
Il s'agissait du fichier .env (racine du site symfony) :
il fallait l'éditer pour permettre la connexion à la BDD : ce n'était pas le bon SGBD (par défaut symfony active postgresql ...) au niveau de la ligne 25 => 32 :
Code:
1 2 3 4 5 6 7 8
| ###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
# DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.7"
DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8"
###< doctrine/doctrine-bundle ### |
J'ai adapté pour mon environnement : et c'est bon ;-P