>

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.








Sobre el autor

Betabeers

Hello, my name is David (AKA Davidjguru) and I'm working as Product Owner for Drupal-based projects at Rojomorgan (@TheRojomorgan), an independent web development and design agency in Seville, Spain, in a little agile team involved with Scrum, Kanban, UX and FLOSS. I've been working with Drupal since 2010. I'm passionate about the culture of shared knowledge and free (libre) software and I have been a software developer for several years, now I'm managing customer accounts and projects based on Drupal. My responsibilities are translate to the team the concerns and thoughts of customers to get an insight into all project stakeholders . I also organize technology events like Betabeers Sevilla (@BetabeersSVQ), the local group of Drupal (@DrupalSevilla) and coordinate a pop culture blog (@CIBASS_Blog -Spanish-). Love y'all