Arquitectura de Drupal 8 tras su integración con Symfony2

27/03/2015
Arquitectura de Drupal 8 tras su integración con Symfony2

La llegada de Drupal 8 ha supuesto que los caminos de Drupal y Symfony2 se unen en muchos puntos. Con el objetivo de reforzar y mejorar el diseño de su arquitectura a bajo nivel, la nueva versión hace uso de muchos de los componentes que tienen más peso en el núcleo de Symfony2.

Por lo tanto, antes de involucrarnos en un proyecto con Drupal 8, es interesante tener una visión general sobre los componentes más importantes que se incorporan y los beneficios que van a suponer para un programador habituado a trabajar con versiones anteriores.

Componentes de Symfony2 integrados en Drupal 8

Los principales componentes provenientes de Symfony2 de los que ahora se hacen uso son:

  • Routing: El enrutado es uno de los principales cambios en Drupal 8. Hasta ahora, un programador que necesitaba crear una ruta para acceder a una página hacía uso del hook_menu. Con la incorporación del componente de routing de Symfony2, un programador de Drupal 8 tendrá que hacer uso del routing.yml, que es el fichero en el cuál se establecerá el path, y el controller, donde se implementará la lógica de cada acción.
  • Yaml: Uno de los principales detalles que un desarrollador habituado a Drupal 7 va a notar al empezar a trabajar con la nueva versión, va a ser que los ficheros .info ahora son renombrados como .info.yml. Además, los ficheros de configuración, routing… también utilizan este mismo formato. Yaml es un formato de datos, que se usa en Symfony2 principalmente en los ficheros de configuración, o para establecer parámetros, rutas… Está basado en XML y es considerado un lenguaje de marcado ligero. A partir de ahora, va a ser más sencillo para un programador de Drupal crear ficheros de configuración gracias al uso de Yaml.​ Conocer más a cerca de los ficheros de configuración Yaml en Drupal 8.

  • Twig: Actualmente para realizar temas en Drupal 7 se usaba el motor de plantillas PHPTemplate. Pero a partir de la versión 8, se produce un cambio importante, la incorporación de un nuevo motor: Twig. El objetivo final sigue siendo el mismo, dotar al programador de la capacidad de sobrescribir cualquier plantilla de Drupal con el objetivo de personalizar su visualización. La diferencia es que, gracias a Twig, vamos a ganar en rapidez por la compilación que hace Twig de las plantillas a código php optimizado. También vamos a ganar en seguridad, debido a que twig evalúa el código no confiable, y en flexibilidad, permitiendo implementar los filtros y etiquetas personalizados que el programador desee.​ No es difícil trabajar con este motor de plantillas, de hecho aquí podéis ver cómo trabajar con Twig en Drupal 8 y Symfony2.

  • DependencyInjection: Este componente está orientado a facilitarnos nuestra labor como programadores, permitiéndonos centralizar el código para poder reutilizarlo posteriormente de una manera sencilla. Esto nos proporciona la posibilidad de crear proyectos más eficientes, ya que sólo se van a cargar las clases cuando sea necesario hacer uso de ellas. En Drupal 7 se hacía uso de la función module_invoke_all(), sin embargo, el nuevo enfoque mejora al actual, ya que esto permite a la distribución de Drupal o a un módulo sobreescribir el modo de realizar las llamadas a otros módulos, por lo que se obtiene una mayor transparencia, gracias a la cuál se pueden intercambiar más partes de Drupal sin necesidad de modificar el core. Además, todos estos servicios pueden ser testeados mediante pruebas unitarias.​

  • Serializer: Hasta la versión 7 de Drupal, para trabajar con datos en formato JSON era necesario el uso de funciones como drupal_json_encode() o drupal_json_decode. A partir de Drupal 8 se puede hacer uso del módulo Serializer de Symfony, que nos facilita el trabajo con formatos JSON y XML. Para usarlo, simplemente tenemos que cargar el servicio del contenedor y ya tendremos acceso a las funciones que nos proporciona dicho módulo, como serialize() o deserialize() que son tan sencillas de utilizar como pasarle un parámetro con la entidad (nodo, usuario…) y el formato de datos (JSON o XML).​

  • Validator: Respecto a las validaciones, con la nueva versión Drupal 8, y con el uso del componente validator de Symfony2, se ha desacoplado la validación de las entidades de las de los formularios. Mientras que hasta ahora traía por defecto muchas validaciones relativas a contenidos específicos de Drupal, con el nuevo componente, un desarrollador tiene a su disposición una gran cantidad de posibilidades respecto a validar en un conjunto de valores, longitudes de texto…​

  • EventDispatcher: Este componente de Symfony2 es una implementación del patrón observer y nos ofrece la posibilidad de suscribirnos a eventos, los cuáles pueden ser activados por cualquier proceso que acceda al objeto EventDispatcher. Gracias a él, una clase puede suscribirse a un evento, y en el momento en el que se dispare dicho evento, ser notificada y actuar en consecuencia. Este componente es muy usado por otros que vienen de Symfony2 como es HttpKernel y que ayudan a mejorar el diseño de la nueva arquitectura.​

  • HttpFoundation: Está compuesto por dos partes, Http Request y Http Response, que son las encargadas de transformar una petición de un usuario en un objeto de tipo Request() y de crear una respuesta mediante la información que se le pasa en un objeto Response(), haciendo uso para ello del componente EventDispatcher.​

  • Debug: Con el objetivo de mejorar la experiencia de los programadores a la hora de depurar las aplicaciones, este componente proveniente de Symfony ofrece unos mensajes de error mucho más descriptivos que los actuales. Asimismo, también destaca por las posibilidades que ofrece respecto al manejador de excepciones, de errores y la detección de los posibles problemas a la hora de realizar la carga de clases.

Arquitectura de Drupal 8 tras su integración con Symfony2

En la siguiente tabla inspirada en el artículo de CIPIX podemos ver de manera más visual el diseño de la arquitectura de Drupal 8 tras su integración con Symfony2:

Diseño de la arquitectura de Drupal 8 tras la integración con Symfony2
En próximos post analizaremos en profundidad el nuevo diseño que presenta la arquitectura tras la integración de los nuevos componentes, y veremos el impacto que va a suponer en cada caso para un desarrollador de Drupal.