web-dev-qa-db-fra.com

Ajouter une bibliothèque à un module en utilisant composer

Je travaille sur un module qui nécessitera une bibliothèque déjà en compositeur.

J'ai ajouté une ligne au fichier composer.json de mon module:

"require": {
   "markrogoyski/math-php" : "dev-master"
}

J'ai exécuté la commande:

composer update .

et un répertoire "vendeur" a été créé dans le répertoire de mon module et les fichiers ont été téléchargés. Cependant, si j'ajoute une instruction use au fichier my_module/src/Controller/Test.php, j'obtiens une erreur:

----Test.php----

<?php
namespace Drupal\lims\Controller;

use Drupal\Core\Controller\ControllerBase;
use Math\Functions\Map\Single;

class Sample extends ControllerBase {
    public function content() {
        print_r(Single::square([1,2,3,4,5]));
    }
}

Je vois l'erreur:

PHP Fatal error:  Class 'Math\\Functions\\Map\\Single' not found in [module path]/src/Controller/Test.php on line 9

Y a-t-il une autre étape que je dois faire pour obtenir la bibliothèque chargée automatiquement dans l'espace de noms correct?

4
Kevin Nowaczyk

En utilisant composer update, Composer a créé le répertoire du fournisseur et le fichier autoload.php, qui est nécessaire pour charger automatiquement la bibliothèque. Malheureusement, Drupal ne charge pas tous les fichiers autoload.php trouvés dans chacun des répertoires contenant un module.

Au lieu d'ajouter la dépendance de votre module dans le fichier composer.json utilisé par Drupal, vous devez éditer sa section extra/merge-plugin pour inclure le répertoire contenant les modules que vous ajoutez. (J'ai ajouté la ligne "modules/*/composer.json".)

"extra": {
    "_readme": [
        "By default Drupal loads the autoloader from ./vendor/autoload.php.",
        "To change the autoloader you can edit ./autoload.php."
    ],
    "merge-plugin": {
        "include": [
            "core/composer.json",
            "modules/*/composer.json"
        ],
        "recurse": false,
        "replace": false,
        "merge-extra": false
    }
},

De cette façon, l'exécution de composer update du répertoire Drupal ajouterait les classes requises dans le répertoire du fournisseur utilisé par Drupal, ce qui les chargerait automatiquement.

Si les modules que vous installez sont tous hébergés sur drupal.org (c'est-à-dire que vous n'utilisez aucun module personnalisé), vous pouvez à la place modifier la section des référentiels pour contenir les lignes suivantes.

"repositories": {
    "drupal": {
        "type": "composer",
        "url": "https://packagist.drupal-composer.org"
    }
}

De cette façon, vous pouvez ajouter un module hébergé sur drupal.org exécutant composer require drupal/module-name à partir du répertoire Drupal root, et Composer installerait ses dépendances (déclarées dans le fichier composer.json du module) dans le répertoire du fournisseur, ce qui rend les classes automatiquement chargé.

6
kiamlaluno

En supposant que vous utilisez le modèle Composer pour Drupal :

  1. Dans votre module personnalisé, exécutez composer init, puis nécessite un package/bibliothèque.
  2. Dans votre Drupal project run composer require wikimedia/composer-merge-plugin.

    Ajoutez ensuite ce qui suit au "extra" tableau dans votre Drupal projet's composer.json:

    "merge-plugin": {
        "include": [
            "web/modules/custom/*/composer.json"
        ]
    }
    

    (Voir les documents sur DO: MergePlugin.php .)

    (Voir composer-merge-plugin sur GitHub.)

  3. Dans votre Drupal project run composer update.

    C'est ça.

1
leymannx