Enrutando en Drupal 8 para construir tu propio módulo
Betabeers Colaboraciones 17/02/2017
A la hora de trabajar con proyectos en Drupal 8, es cierto que a veces podemos encontrarnos con módulos que todavía no están migrados o cuyo funcionamiento todavía no está suficiente estable. A veces también el camino más corto es crear directamente nuestros propios módulos con las funcionalidades que necesitamos y esto, en el contexto de los cambios estructurales y procedimentales que se han llevado a cabo en la evolución de Drupal implican, entre otras cosas, cambiar algunas maneras de afrontar el desarrollo. Dado que Drupal 8 ahora adquiere estándares que provienen de otros proyectos basados en PHP, tal vez hay que aprender (o re-aprender) algunas cosas por el camino. En este artículo vamos a repasar algunas claves para sacar adelante nuestro propio desarrollo de módulos para un proyecto basado en Drupal 8 y cuestiones que debemos tener en cuenta poniéndolas en contexto.
Conceptos varios que conviene tener claros
POO
Drupal 8 usa PHP 7, que tras el vacío de la nunca lanzada versión 6 y las subsiguientes mejoras, se lanza a Orientación a Objetos ya directamente, sin las versiones fakes de etapas anteriores y superando la paradoja de tipado fuerte/débil que venía ocurriendo con anterioridad. Conviene repasar conceptos fundamentales de la POO para estar convenientemente ubicado en ello. Si no estás familiarizada con la orientación a objetos o lo tienes algo olvidado, es muy recomendable repasar los siguientes conceptos fundamentales del paradigma: Clases, Objetos, Constructores, Herencia, Polimorfismo...ya sabes, esa mandanga. Aquí algunas referencias sobre los cambios que trajo PHP7 y aquí manual POO con PHP
Componentes Symfony
De todos los componentes integrados en Drupal 8, hay dos que son fundamentales conocer mínimamente, ya que afectan directamente a la construcción del modelo más básico de módulos Drupal:
1- YAML
YAML es un lenguaje estructurado sin etiquetas, muy simplificado y human-friendly, el nuevo estándar utilizado para todas las descripciones de configuración de Drupal 8, que ahora pasan a ser ficheros de extensión .yml y como veremos más adelante, sustituyen a otros formatos. Este componente Symfony en particular se encarga de parsear la información descrita en estos ficheros y manejarla como arrays en PHP. Especificaciones de YAML 1.2
2- Routing
Este componente permite mapear direcciones URL y hacer matching entre peticiones y controladores, mapeando una petición HTTP mediante ficheros de configuración YAML, lanzando acciones asociadas en las clases desarrolladas en nuestros módulos.
3- Controladores
Los “Controladores” son la parte final del concepto MVC, Modelo-Vista-Controlador, es decir, una cosa que quedaba algo fuera del entorno inmediatamente anterior de Drupal 7 pero que ahora a través de la integración con Symfony llega plenamente a Drupal 8.
Por simplificar para seguir avanzando, podríamos decir que es una función PHP que permite admitir peticiones HTTP y a cambio devolver una respuesta que puede tener diferentes formatos: HTML, XML, JSON, imágenes o whatever...conceptualmente viene a ser la pieza que articula la lógica de trabajo para procesar respuestas en base a un input del sistema.
En Drupal 8 y siempre dentro de este contexto, viene a ser el equivalente a la función page callback del hook_menu(), la función asociada al procesamiento de direcciones y rutas, para entre otras cosas mostrar elementos de menú e integrar nuevas features en nuestros módulos desde la interfaz de administración del site. La esencia es la misma: construir una clase Controller que disponga métodos para mostrar datos, pero a la manera de Symfony.
La descripción ofrecida por la documentación de Symfony es clara:
-
"A controller is a PHP function you create that takes information from the HTTP request and constructs and returns an HTTP response..."
-
"Every request handled by a Symfony2 project goes through the same simple lifecycle. The framework takes care of the repetitive tasks and ultimately executes a controller, which houses your custom application code."
Así que bien ¿Qué necesitamos para crear un módulo propio para Drupal?
Ubicación del módulo:
Crearemos el directorio para el módulo dentro de la carpeta /modules de la raíz del proyecto y dentro de un directorio que se llame /custom que vamos a crear para tenerlo algo más controlado, algo tipo /betabeers
Fichero de información del módulo:
Vamos a crear el fichero de información del módulo, en mi caso, betabeers.info.yml en el que le vamos a indicar los datos básicos del módulo, el nombre, la versión, etc. Con la carpeta /betabeers creada en la ruta /modules/custom/betabeers/ añadimos el archivo betabeers.info.yml
Este archivo es el equivalente a los .info de Drupal 7, solo que ahora se utiliza yaml.
Dentro del archivo añadimos lo siguiente:
name: betabeers
type: module
description: Módulo usado para post Betabeers
core: 8.x
package: Custom
Con esta información, en la vista de administración de módulos de Drupal ya aparecerá la info del módulo y este quedará activable (aunque en realidad no haya ninguna funcionalidad asociada).
La ruta
Para definir acciones asociadas o simplemente apuntar al controlador que se encargará de ofrecer la funcionalidad, hay que crear un fichero de tipo routing para el mapeo con nombre_modulo.routing.yml, en este caso betabeers.routing.yml. Aquí pondremos las rutas de las acciones que describamos, apuntando a un controlador y dentro de este, a algún método específico con el que queramos trabajar.
En el contenido indicamos el nombre o clave de la ruta, la ruta que se va a cargar en la url en si, el controlador, el título de la página, así como permisos u otras restricciones de acceso.
Así que creamos el archivo betabeers.routing.yml y dentro ponemos una configuración del tipo:
betabeers.content:
path: '/admin/config/betabeers'
defaults:
_controller: '\Drupal\betabeers\Controller\BetabeersController::content'
_title: 'Módulo Betabeers'
requirements:
_permission: 'access content'
El controlador
La tercera pieza es el controlador que debe encargarse de ejecutar las acciones asociadas, así que entonces tenemos que crear un controlador para crear nuevas páginas o para crear la funcionalidad del módulo en si mismo. Dentro del directorio del módulo creamos un directorio /src, dentro de este otro llamado /Controller y dentro ya creamos el controlador. En mi caso quedaría así modules/custom/betabeers/src/controller/BetabeersController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public function content() { return array( '#type' => 'markup', '#markup' => $this->t('Testing Drupal 8 for Betabeers'), ); }
}
?> |
¿Queremos un enlace de menú?
Fácil: nos vamos a la raíz del directorio del módulo y creamos un nuevo fichero betabeers.links.menu.yml, donde anotaremos las claves de linkado y la información contextual necesaria (sección “padre”donde se mostrará, la ruta que seguirá el enlace, la descripción del propio módulo…)
1 2 3 4 5 |
betabeers.homepage: title: Módulo Betabeers description: 'Configuración del módulo Betabeers' parent: system.admin_config_ui route_name: betabeers.content |
Repasemos todo el proceso a modo de resumen:
1- Crea los directorios necesarios
2- Crea el info.yml
3- Crea el routing.yml
4- Crea el Controller.php
5- Crea el links.menu.yml
Y 6: Prueba que todo funciona tal y como esperas.