Een databaseconnectie-object aanmaken
Interactie met de database moet plaatsvinden via een databaseconnectie-object. Er zijn verschillende scenario’s die wat extra aandacht vereisen:
1. In procedurele code, d.w.z. in *.module-, *.inc- of scriptbestanden:
De beste manier om een instantie van het databaseconnectie-object te maken is via de Service Container.
Voorbeeld:
$database = \Drupal::database();
// Of
$database = \Drupal::service('database');
Dit levert een databaseconnectie-object op dat is geconfigureerd om verbinding te maken met de standaard primaire database, zoals gedefinieerd in de databaseconfiguratie in het bestand settings.php.
2. Om historische en technische redenen is het type dat wordt geretourneerd door \Drupal::database() een \Drupal\Core\Database\Connection, en wordt het daarom soms $connection genoemd.
3. In OOP-code:
- In sommige gevallen is het databaseconnectie-object al beschikbaar als een lid van de huidige klasse; bijvoorbeeld veel plugins en services hebben $this->database (of $this->connection) als databaseconnectie-object.
- Gebruik indien mogelijk DI (Dependency Injection) om de service @database of $container->get('database') te injecteren.
- Als dat niet mogelijk is (zoals in een statische methode van een klasse), gebruik dan \Drupal::database().
- Als services nog niet beschikbaar zijn, kan \Drupal\Core\Database\Database::getConnection() een databaseverbinding ophalen.
- In unittests hebben we geen geladen core of ingebouwde container. Unittests zouden normaal gesproken geen toegang tot de database moeten hebben. Een unittest die een databaseservice nodig heeft, moet worden omgezet naar een core test.
- In core classes en functionele tests hebben we $this->container->get('database'). Sommige testschrijvers kunnen merken dat de container waarnaar de testklasse verwijst niet synchroon loopt met de huidige container tijdens een request in een functionele test. In dat geval kan de testschrijver $this->rebuildContainer() aanroepen en daarna opnieuw toegang krijgen tot $this->container->get('database').
Een andere databaseverbinding gebruiken
Als je site meerdere databases gebruikt, kun je Database::getConnection() gebruiken om een query uit te voeren op een andere database dan de standaarddatabase. Bijvoorbeeld:
$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');
Dit zorgt voor een verbinding met de database die in settings.php is gedefinieerd als:
$databases['other_database']['default']