Creación del objeto de conexión a la base de datos
La interacción con la base de datos debe realizarse a través del objeto de conexión a la base de datos. Hay varios escenarios que requieren cierta atención:
1. En código procedural, es decir, archivos *.module, *.inc o scripts:
La mejor manera de crear una instancia del objeto de conexión a la base de datos es a través del Contenedor de Servicios.
Ejemplo:
$database = \Drupal::database(); // O bien $database = \Drupal::service('database');
Esto resultará en un objeto de conexión a la base de datos configurado para conectarse a la base de datos principal por defecto, según lo definido en la configuración de base de datos en el archivo settings.php.
2. Por razones históricas y técnicas, el tipo devuelto por \Drupal::database() es \Drupal\Core\Database\Connection, por lo que a veces se le denomina $connection.
3. En código OOP:
- En algunos casos, el objeto de conexión a la base de datos ya puede estar disponible como miembro de la clase actual; por ejemplo, muchos plugins y servicios tienen $this->database (o $this->connection) como miembro con la conexión a la base de datos.
- Si es posible, use la inyección de dependencias (DI) para usar el servicio @database o $container->get('database') para inyectar la conexión a la base de datos.
- Si no es posible (como en un método estático de clase), use \Drupal::database().
- Si los servicios aún no están disponibles, \Drupal\Core\Database\Database::getConnection() puede obtener la conexión a la base de datos.
- En pruebas unitarias, no tenemos un núcleo cargado ni contenedor incorporado. Generalmente las pruebas unitarias no deberían acceder a la base de datos. Una prueba unitaria que requiere el servicio de base de datos debe convertirse en una prueba de núcleo.
- En clases del núcleo y pruebas funcionales, tenemos $this->container->get('database'). Algunos autores de pruebas pueden notar que el contenedor referenciado por la clase de prueba puede no estar sincronizado con el contenedor actual durante la solicitud en pruebas funcionales. En este caso, el autor de la prueba puede llamar a $this->rebuildContainer() y luego volver a acceder a $this->container->get('database').
Uso de otra conexión a base de datos
Si su sitio usa múltiples bases de datos, para ejecutar una consulta en una base de datos distinta a la predeterminada, use Database::getConnection(). Por ejemplo:
$connection = \Drupal\Core\Database\Database::getConnection('default', 'other_database');
Esto proporcionará una conexión a la base de datos definida en settings.php como:
$databases['other_database']['default']
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.