Crear un módulo en Drupal 10 u 11 parte de definir una estructura clara: un directorio tu_modulo / con archivos como tu_modulo.info.yml, tu_modulo.routing.yml y clases en src/. Primero identificas la funcionalidad que quieres añadir (por ejemplo, un formulario personalizado o un servicio de integración con una API), y luego organizas tu lógica en controladores, servicios y plugins. Gracias al sistema de inyección de dependencias de Drupal (que utiliza Symfony bajo el capó), puedes separar responsabilidades y reutilizar código. Sin embargo, para escalar adecuadamente y evitar “código espagueti”, conviene aplicar un conjunto de buenas prácticas de diseño: los principios SOLID.
¿Qué son los principios SOLID?
SOLID es un acrónimo que resume cinco reglas fundamentales del diseño orientado a objetos. Cada letra corresponde a un principio que facilita la legibilidad, mantenibilidad y extensibilidad del código.
Principios SOLID
S – Single Responsibility Principle (SRP)
Principio de Responsabilidad Única: cada clase o módulo debe tener una única razón para cambiar. Si un servicio gestiona tanto el envío de correos como la validación de formularios, viola el principio de SRP.
O – Open/Closed Principle (OCP)
Principio de Abierto/Cerrado: las entidades de software (clases, módulos, funciones) deben estar abiertas a la extensión pero cerradas a la modificación. Añadir funcionalidad no debe implicar alterar el código existente.
L – Liskov Substitution Principle (LSP)
Principio de Sustitución de Liskov: los objetos de una clase derivada deben poder sustituir a los de su clase base sin alterar el comportamiento del programa. Es decir, heredar sin romper contratos.
I – Interface Segregation Principle (ISP)
Principio de Segregación de Interfaces: es mejor tener varias interfaces específicas que una interfaz general demasiado grande. Cada cliente debe implementar solo los métodos que realmente utiliza.
D – Dependency Inversion Principle (DIP)
Principio de Inversión de Dependencias: las clases de alto nivel no deben depender de clases de bajo nivel, sino de abstracciones (interfaces). Inyectar dependencias en lugar de instanciarlas directamente.
Aplicando SOLID en módulos de Drupal
- SRP en servicios Drupal: crea servicios dedicados en your_module.services.yml, como MailSender para correos y DataValidator para reglas de negocio. Cada uno solo implementa una responsabilidad.
- OCP con tags y plugins: define una interfaz ContentFormatterInterface y registra implementaciones como plugins o servicios etiquetados. Así, al añadir un nuevo formateador, no tocas el módulo base, solo creas una clase nueva que implemente la interfaz.
- LSP en extensiones de plugins: si extiendes el plugin de campo FormatterBase, respeta el método view() y la firma de retorno. No cambies parámetros ni arrojes excepciones inesperadas, para garantizar que Drupal pueda sustituir tu formateador sin errores.
- ISP para definiciones de interfaz: separa contratos en DataLoaderInterface, DataSaverInterface y DataDeleterInterface. Un servicio de importación de CSV implementa solo DataLoaderInterface, sin verse forzado a incluir métodos de guardado o borrado.
- DIP mediante inyección de dependencias: en lugar de llamar \Drupal::database() dentro de tu clase, define un servicio DatabaseClientInterface que implemente la conexión a la base de datos. Luego, en el constructor de tu servicio, recibe DatabaseClientInterface $db. En entornos de pruebas, puedes inyectar un código temporal sin tocar la lógica real.
SOLID como inversión valiosa
Incorporar SOLID en el desarrollo de módulos Drupal 10 u 11 impulsa un código más limpio y robusto. Gracias a SRP, OCP, LSP, ISP y DIP, reduces acoplamientos, facilitas tests automatizados y agilizas la incorporación de nuevas funcionalidades. Aunque supone un poco más de diseño al inicio, el ahorro en mantenimiento y la mejora en colaboración hacen de SOLID una inversión imprescindible para cualquier equipo, ya sea una gran agencia o una pyme de 10 trabajadores.
