Drupal, composer y PHP
Published: 2023-07-23 13:31:14


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7voa3fgixy4l6l6unic3.jpeg)

# Intro

  En el tránsito de su versión 7 a 8 la comunidad Drupal reescribió el 70% del código fuente. En ese titánico esfuerzo se adoptarón 'mejores prácticas' y se busco un cierta convergencia con la comunidad y las herramientas del lenguaje de programación PHP. En particular, la adopción de [Symfony como framework](https://symfony.com/) subyacente y [Twig como motor de plantillas](https://twig.symfony.com/) para el llamado 'frontend' (diseño, o 'Theme' en la jerga Drupal). Una de las derivadas es que la gestión de paquetes PHP se realiza mediante Composer. De ello hablaremos aquí hoy.

# ¿Por qué Composer?

 Veamos porque no es suficiente con descargar los módulos Drupal como hacíamos antaño, y el porque de la necesidad de'otra herramienta'

- los módulos contribuidos y temas (diseño) a menudo requieren de librerías de terceros instaladas via Composer.En la ausencia de Composer en el proyecto, necesitarías manejar estos de forma individual al descargar: cosa que es mejor evitar.
- algunos paquetes y módulos únicamente son compatibles con determinadas versiones de PHP y de Drupal. Es necesario identificar esos requisitos y gestionarlo.
- algunos  paquetes y módulos entran en conflicto con otros paquetes. Se requeriría que leyeras el fichero composer.json para gestionar ese aspecto.
- cuando actualizas  paquetes o una versión de PHP, necesitarías tener en cuenta y aplicar todo lo descrito anteriormente una y otra vez.
- por último, el uso de 'drush' ha sido 'deprecado' en favor de Composer.

  De ahí la clara necesidad del uso de un gestor de paquetes. Un buen punto de partida es la estupenda documentación en Drupal.org al respecto. Así pues instala Composer en tu computadora para
que realize por tí todo ese minucioso trabajo.



  Hay disponible una plantilla Composer para proyectos Drupal, desda la que puedes clonar el proyecto  

```
https://github.com/drupal/recommended-project
```

Es el punto de partida recomendado en este nuevo flujo de trabajo (workflow) en una instalación de Drupal 8.
Asegurate antes de que dispones como base una versión de PHP compatible. Y ahora sí ejecuta:

```
$ composer create-project drupal/recommended-project:8.x-dev mi-dir --no-interaction
```

> NOTA: para usar la recién liberada versión 9 del core  : 9.x-dev

Ello copiará el drupal-project en un directorio de ejemplo mi-dir' , y descargará el núcleo (core) Drupal y algunos paquetes útiles. Este es el momento de acceder al directorio mencionado y ejecutar

```
$ cd mi-dir
$ git init
```

inicializando el repositorio de trabajo en local, para luego realizar el 'git commit' original del proyecto, si vas querer manejarlo con control de versiones y todas sus ventajas.

Este puede ser un buen momento para echar un vistazo al fichero composer.json :

```
{
    "name": "drupal-composer/drupal-project",
    "description": "Project template for Drupal 8 projects with composer",
    "type": "project",
    "license": "GPL-2.0-or-later",
    "authors": [
        {
            "name": "",
            "role": ""
        }
    ],
    "repositories": [
        {
            "type": "composer",
            "url": "https://packages.drupal.org/8"
        }
    ],
    "require": {
        "php": ">=7.0.8",
        "composer/installers": "^1.2",
        "cweagans/composer-patches": "^1.6.5",
        "drupal/console": "^1.0.2",
        "drupal/core": "^8.8.0",
        "drupal/core-composer-scaffold": "^8.8.0",
        "drush/drush": "^9.7.1 | ^10.0.0",
        "vlucas/phpdotenv": "^4.0",
        "webflo/drupal-finder": "^1.0.0",
        "zaporylie/composer-drupal-optimizations": "^1.0"
    },
    "require-dev": {
        "drupal/core-dev": "^8.8.0"
    },
    "conflict": {
        "drupal/drupal": "*"
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "config": {
        "sort-packages": true
    },
    "autoload": {
        "classmap": [
            "scripts/composer/ScriptHandler.php"
        ],
        "files": ["load.environment.php"]
		
	...	
	...	
       }
}
```


 contenido en el repositorio clonado.

 Observamos que se requiere 

```
    "require": {
        "php": ">=7.0.8",
..

```

PHP versión 7 o superior, y el núcleo (core) Drupal.

```
      "drupal/core": "^8.8.0
```



Este fichero sirve de "receta" para el proyecto, orquestando las versiones de los diferentes paquetes.

# ¿ Como descargo módulos y themes Drupal?


  Superado el uso de 'drush dl' (habitual en Drupal 7) para obtener modulos contribuidos y Themes, hay que acostumbrarse al 'Composer workflow' y sacarle partido. 
La sintaxis para la selección requerida es diferente, y en la mayoría de casos conviene no realizar (git) commit de los ficheros descargados en tu repositorio. 

Para la mayoría de los casos basta con ejecutar

```
$ composer require [vendor]/[packagename]
```

para obtener el paquete deseado. La mayoría de  módulos contribuidos y Themes se alojan en un repositorio Composer dedicado, el cual es configurado por 'drupal-project' por defecto. Ello implica que podemos usar drupal como 'vendor' para descargar módulos Drupal y Themes que son mantenidos en drupal.org.

  Por ejemplo, si ahora quieres obtener el módulo Devel, puedes usar el siguiente comando:

```
$ composer require drupal/devel
```

Para la mayoría de los casos, esto descargará la más reciente y estable versión del módulo Devel compatible con tu versiones de Drupal y  PHP en uso. 
Si usaste el repostoria 'drupal-project' mencionado, el módulo será descargado en la carpeta web/modules/contrib de forma estándar.

  Como vemos, esto nos proporciona un flujo de trabajo/workflow sólido desde el manejar nuestro proyecto. Para que el éxito del mismo tan sólo falta combinarlo con Git, el sistema de control de versiones software por excelencia.
De eso (Drupal PHP + Composer + Git workflow )  hablaremos en futuros blogposts.

  Esperamos te resulten útiles estas prácticas tanto o más que a nosotros en Librebits.

Have Fun | A disfrutar


Fuentes:

- Lullabot   https://www.lullabot.com/articles/drupal-8-composer-best-practices
- Drupal.org https://www.drupal.org/docs/develop/using-composer/using-composer-to-install-drupal-and-manage-dependencies