Création d'un objet de connexion à la base de données
L’interaction avec la base de données doit se faire via un objet de connexion à la base de données. Plusieurs scénarios nécessitent une attention particulière :
1. Dans un code procédural, par exemple les fichiers *.module, *.inc ou scripts :
La meilleure façon de créer une instance de l’objet de connexion à la base de données est d’utiliser le Service Container.
Exemple :
$database = \Drupal::database(); // Ou $database = \Drupal::service('database');
Cela renverra un objet de connexion configuré pour se connecter à la base de données principale par défaut, telle que définie dans la configuration de la base de données dans le fichier settings.php.
2. Pour des raisons historiques et techniques, le type retourné par \Drupal::database() est \Drupal\Core\Database\Connection, et il est donc parfois appelé $connection.
3. Dans du code orienté objet (OOP) :
- Dans certains cas, l’objet de connexion à la base de données est déjà disponible en tant que membre de la classe courante ; par exemple, de nombreux plugins et services disposent de $this->database (ou $this->connection) comme membre représentant la connexion à la base.
- Si possible, utilisez l’injection de dépendances (DI) pour utiliser le service @database ou $container->get('database') afin d’injecter la connexion à la base de données.
- Si ce n’est pas possible (comme dans une méthode statique de classe), utilisez \Drupal::database().
- Si les services ne sont pas encore disponibles, \Drupal\Core\Database\Database::getConnection() permet d’obtenir une connexion à la base.
- Dans les tests unitaires, le noyau et le container ne sont pas chargés. Les tests unitaires ne devraient généralement pas accéder à la base de données. Un test unitaire nécessitant un service de base de données doit être converti en test d’intégration (kernel test).
- Dans les tests kernel et fonctionnels, on a accès à $this->container->get('database'). Certains auteurs remarquent que le container référencé par la classe de test peut ne pas être synchronisé avec le container actuel durant la requête. Dans ce cas, l’auteur peut appeler $this->rebuildContainer() puis accéder de nouveau à $this->container->get('database').
Utiliser une autre connexion à la base de données
Si votre site utilise plusieurs bases de données, pour exécuter une requête sur une base autre que celle par défaut, utilisez Database::getConnection(). Par exemple :
$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');
Cela récupère la connexion à la base définie dans settings.php sous :
$databases['other_database']['default']