Drupal y Doctrine: mezclando dos paradigmas
Juan Pablo Romero
Software EngineerUna de las características que nos encantan de Drupal es su flexibilidad tanto para el desarrollador como para el usuario. Por esa razón muchos sitios de renombre en internet lo han elegido como gestor de contenidos (CMS) y al tener una comunidad tan activa, la cantidad de módulos y componentes disponibles lo hacen aún más atractivo.
Sin embargo, al momento de desarrollar soluciones más específicas el interior de Drupal, que involucren la creación de nuevas entidades y la consulta permanente de datos, se empiezan a conocer ciertos aspectos poco cómodos para el desarrollador como la capa de abstracción a base de datos (DBAL, Data Base Abstraction Layer ), la cuál aún carece de ciertas características como por ejemplo el soporte real para un conjunto extendido de motores de bases de datos (aunque en Drupal 7 se amplió la cantidad de motores), mejor manejo de la integridad referencial y sobre todo facilidad en la escritura de consultas (sobre todo en Drupal 6).
Buscando una mejor forma de trabajar el acceso a la base de datos con Drupal, decidimos combinar la flexibilidad del reconocido CMS con la potencia del componente
ORMde
Doctrine, cuestión que ya se había planteado en Drupal 5 con un
módulo escrito por uno de los líderes del desarrollo de Doctrine, el cual se tomó como base para hacer las adaptaciones para Drupal 6 y 7.
Ventajas de la implementación
Como se mencionó anteriormente, este tipo de integración es viable en la medida en que el desarrollo sobre Drupal requiera de la creación de entidades específicas para dar soporte a la lógica de negocio (creación de nuevas tablas en la base de datos). Con esto en mente, la forma de declarar los modelos (usando esquemas yaml o construyendo las clases de cero) es mucho más sencilla y clara (no sé si sea un sentimiento generalizado, pero declarar un modelo en Drupal 6 es poco cómodo). A continuación algunas ventajas en el uso de Doctrine + Drupal:
- Declaración de modelos flexible y sencilla (a través de YAML)
- Generación automática del modelo de clases
- Disponibilidad de los comportamientos de Doctrine (sluggable, searchable, soft delete, ....)
- Event listeners y transacciones
- Soporte para motores como MySQL, PostgreSQL, Oracle, Informix, SQL Server, entre otros
Desde luego, Doctrine ofrece muchas otras características que también estarán disponibles y facilitarán el trabajo al desarrollador. Para explicar de mejor manera la funcionalidad de esta integración, tomaremos un sencillo ejemplo de cómo traer un listado de todos los usuarios activos del sistema:
// Drupal 6
$sql = "SELECT name, mail FROM {users} WHERE status = 1";
$result = db_query($sql);
while ($row = db_fetch_object($result)) {
// más codigo .....
}
// Drupal 7
$result = db_select('user', 'u')
->fields('u.name, u.mail')
->condition('status', 1, '='))
->execute()
while ($row = $result->fetchAssoc()) {
// mas codigo
}
// Doctrine
$query = Doctrine_Query::create()
->select('u.name, u.mail')
->from('User u')
->where('u.status = ?', 1)
->execute(array(), Doctrine_Core:::HYDRATE_ARRAY);
foreach ($query as $userData) {
// mas código .....
}
Tal vez no sea notable la diferencia entre Drupal 7 y Doctrine para este caso, sin embargo en consultas más complejas se puede apreciar la potencia y utilidad de Doctrine, por ejemplo para obtener los roles de un determinado usuario.
¿ Cómo usarlo ?
Bien, para poder integrar de forma sencilla Doctrine + Drupal hemos dispuesto un módulo para Drupal 7, que provee un módelo básico del esquema de base de datos inicial, se puede descargar de:
https://github.com/juanblo/drupal-doctrine. Ya lo hemos usado en varios proyectos con muy buenos resultados.
En un próximo post explicaremos con más detalles el módulo y como utilizar las características más atractivas de Doctrine.
Written by Juan Pablo Romero
Juan Pablo designs and builds robust software solutions with a focus on performance and usability. His problem-solving skills and attention to detail ensure high-quality and efficient applications.