Gérez vos dépendances avec composer sur Drupal 7

Auteur(s) de l'article

Composer permet de gérer vos dépendances PHP. Vous retrouverez sur packagist.org des centaines de librairies utilisables pour vos projets PHP. Mais comment tirer parti de ces librairies avec Drupal? Comment les intégrer à vos modules?
Le problème est plus compliqué qu’il n’y parait. En effet, Drupal a sa propre gestion de dépendance pour ses modules. Comment faire quand chaque module à son propre fichier de dépendances (composer.json)?

Composer manager

Heureusement, la communauté s’est déjà penché sur le problème et nous avons aujourd’hui une solution qui, loin d’être parfaite, fonctionne plutôt bien: composer manager.
Composer manager fait deux choses:
  • Génèrer un fichier composer.json unique contenant l’ensemble des dépendances. Pour cela il recherche dans chaque module un fichier composer.json et les fusionnes ensemble.
  • Injecter l’autoloader dans un hook_init
Bien que composer manager propose une interface graphique, nous allons voir ici comment l’utiliser avec drush en ligne de commande. Cette approche permet de générer notre fichier composer.json dans un répertoire inaccessible par votre serveur web.

Utiliser composer manager

Configurer composer manager

Il est recommandé de modifier le chemin du dossier vendor et du fichier composer.json généré. Les valeurs recommandées sont les suivantes:

// settings.php
$conf['composer_manager_vendor_dir'] = '../vendor';
$conf['composer_manager_file_dir'] = '../';
Vous pouvez également gérer ces options depuis l’interface.

Ajouter composer.json à votre module

La première étape consiste à ajouter votre composer.json à la racine de votre module. Ici nous allons ajouter goute:

{
"require": {
"fabpot/goutte": "~2.0"
}
}

Générer un composer.json global

Si vous activez un module avec drush en composer manager, vous proposera automatiquement de mettre à jour le fichier composer.json global.
Il vous est aussi possible de générer le fichier à tout moment via

drush composer-json-rebuild
Pour ensuite à la racine de votre projet Drupal lancer

composer install

Ce qui téléchargera les dépendances dans le dossier vendors.

Utiliser votre librairie

C’est très simple. Vus que l’autoloader est chargé automatiquement il suffit d’instancier la class qui vous intéresse ici

$client = new Goutte\Client();
Si vous souhaiter accéder à votre class avant que hook_init soit exécuté vous pouvez charger l’autoloader manuellement

use Goutte;
$loader = \ComposerAutoloaderInitComposerManager::getLoader();
Client::registerLoader(array($loader, 'loadClass'));
À vous le meilleur des deux mondes!