Biliothek in custom Modul per Composer einbinden

Problemstellung:

Wir wollen einen Klasse einer externen Biblothek in einem custom Modul verwenden. Die Biblothek soll sauber über Composer einbunden werden.

Zum Verständnis:

Drupal lädt nur den Autoloader in dem Projekt verdor Verzeichnis. Also werden die Biliotheken im Moduel vendor Unterverzeichnis nicht geladen. Wir müssen also erreichen, dass die Biliothek im Projekt vendor Verzeichnis installiert wird und diese über den entsprechenden Namespace ansteuern.

Um die Installation der Bibliothek von unserem custom Modul aus zu initieren, ist das merge-plugin erforderlich.

Um das Ziel zu erreichen sind 3 Schritte nötig:

  1. merge-plugin Biliothek installieren
  2. Statement in die Projekt composer.json Datei einfügen
  3. Die Modul composer.json Datei erstellen

1. Schritt - merge-plugin Biliothek installieren

Composer  Befehl in Projektverzeichnis ausführen. Also in dem Verzeichnis wo die zentrale composer.json Datei liegt.

composer require wikimedia/composer-merge-plugin

2. Schritt - Statement in die Projekt composer.json Datei einfügen

 

Folgende Anweisung unter den extra Schlüssel eingeben.

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

    "extra": {
        "composer-exit-on-patch-failure": true,
        "patchLevel": {
            "drupal/core": "-p2"
        },
        "installer-paths": {
            "web/core": ["type:drupal-core"],
            "web/libraries/{$name}": ["type:drupal-library"],
            "web/modules/contrib/{$name}": ["type:drupal-module"],
            "web/profiles/contrib/{$name}": ["type:drupal-profile"],
            "web/themes/contrib/{$name}": ["type:drupal-theme"],
            "drush/Commands/{$name}": ["type:drupal-drush"]
        },
        "drupal-scaffold": {
            "initial": {
                ".editorconfig": "../.editorconfig",
                ".gitattributes": "../.gitattributes"
            }
        },
        "merge-plugin": {
            "include": [
                "web/modules/custom/*/composer.json"
            ]
        }
    }
}

Damit werden alle composer.json Dateien der custom Module einbezogen.

Nun können wir einfach einen composer.json im Modul anlegen und über require die Biblothek laden. Hier ein Beispiel.

{
    "require": {
        "JeroenDesloovere/VCard": "~1.0"
    }
}

Führen wir jetzt im Pojektverzeichnis den Befehl composer update aus, dann wird die Biblothek in das Projekt vendor-Verzeichnis geladen.

Verwendung der Klasse:

Um die Klasse in unserem Modul verwenden zu können, müssen wir den richtigen Namespace kennen.

Gehen wir in die Klasse der Bibliothek, sehen wir.

namespace JeroenDesloovere\VCard;

In unserem Modul hängen wir im Usestatment dann einfach noch die Klasse an.

use JeroenDesloovere\VCard\VCard;

Im PHP-Code kann ich dann die Klasse initialisieren.

    $vcard = new VCard();

Das wars. :-)