Creazione di un oggetto di connessione al database
L’interazione con il database deve avvenire tramite un oggetto di connessione al database. Ci sono diversi scenari che richiedono un po’ di attenzione:
1. Nel codice procedurale, cioè nei file *.module, *.inc o script:
Il modo migliore per creare un’istanza dell’oggetto di connessione al database è tramite il Service Container.
Esempio:
$database = \Drupal::database();
// Oppure
$database = \Drupal::service('database');
Questo restituirà un oggetto di connessione al database configurato per collegarsi al database principale predefinito, come definito nella configurazione del database nel file settings.php.
2. Per ragioni storiche e tecniche, il tipo restituito da \Drupal::database() è \Drupal\Core\Database\Connection, e per questo a volte viene chiamato $connection.
3. Nel codice OOP:
- In alcuni casi l’oggetto di connessione al database può essere già disponibile come membro della classe corrente; ad esempio, molti plugin e servizi hanno $this->database (o $this->connection) – l’oggetto di connessione al database come membro.
- Se possibile, utilizzare la DI (Dependency Injection) per usare il servizio @database o $container->get('database') per iniettare la connessione al database.
- Se non è possibile (come in un metodo statico di classe), usare \Drupal::database().
- Se i servizi non sono ancora disponibili, \Drupal\Core\Database\Database::getConnection() può recuperare una connessione al database.
- Nei test unitari non abbiamo un core caricato o un container disponibile. I test unitari di solito non devono accedere al database. Un test unitario che richiede il servizio database dovrebbe essere trasformato in un test di tipo kernel.
- Nelle classi del core e nei test funzionali abbiamo $this->container->get('database'). Alcuni autori di test potrebbero scoprire che il container a cui fa riferimento la classe di test non è sincronizzato con il container corrente durante una richiesta in un test funzionale. In questo caso, l’autore del test può chiamare $this->rebuildContainer() e poi accedere nuovamente a $this->container->get('database').
Uso di un’altra connessione al database
Se il tuo sito utilizza più database, per eseguire una query su un database diverso da quello predefinito utilizza Database::getConnection(). Ad esempio:
$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');
Questo garantirà una connessione al database definito in settings.php come:
$databases['other_database']['default']