it-swarm.com.de

So laden Sie Klassen aus einer Drittanbieter-Bibliothek automatisch PHP Bibliothek)

Ich möchte eine Drittanbieter-Bibliothek PHP) in meinem Modul verwenden und wollte fragen, was ich tun muss, um die Klassen automatisch zu laden.

Beispiel: Drupal\my_module\MyClass möchte ThirdPartyNamespace\Something\Else\Class1 instanziieren

Das offizielle Drupal 8-Dokumentation behandelt nicht wirklich komplexere Namespace-Szenarien.

7
Roger

Drupal verwendet composer, um die Bibliotheken von Drittanbietern (Symfony, Guzzle usw.) zu verwalten. Das Problem ist Drupal hat den Herstellerordner in den Core versioniert Dies ist ein Problem, da Sie, wenn Sie eine neue Bibliothek im Root-Composer hinzugefügt haben, das Herstellerverzeichnis und die Datei composer.json/composer.lock ändern. Wenn also Drupal veröffentlicht a In der neuen Version werden Ihre Änderungen gelöscht.

Das Modul Composer Manager wird erstellt, um das Problem zu lösen. Sie müssen eine composer.json-Datei in Ihr Modul aufnehmen. Das Composer Manager-Modul lädt die Bibliothek herunter und registriert eine neue Autoload-Datei (das zweite Autoload).
Das Problem besteht nur dann, wenn Sie eine Middleware-Bibliothek verwenden müssen, da das Composer Manager-Modul ein neues Autoload im Request Kernel-Ereignis registriert. Dieses Ereignis wird nach aufgerufen die Middleware, daher ist diese Bibliothek in der Middleware-Ebene nicht verfügbar.

In den meisten Fällen ist das Modul Composer Manager) die beste Lösung, um neue Anbieter hinzuzufügen.

Es gibt das Problem Entfernen Sie externe Abhängigkeiten aus dem Kern-Repo und lassen Sie Composer stattdessen die Abhängigkeiten verwalten .

4
dmouse

Ich habe die Datei composer.json im Stammverzeichnis meines Projekts Drupal] und in dem Modul bearbeitet, das auf der Bibliothek basiert. Dann habe ich die Hauptklasse über einen festen Pfad geladen:

require_once (\Drupal::root() . '/vendor/campaignmonitor/createsend-php/csrest_general.php');

Dann bemerkte ich ein Problem beim Instanziieren eines Objekts der Klasse:

$wrap = new CS_REST_General($auth);

Anscheinend müssen Sie also ein '\' hinzufügen, z.

$wrap = new \CS_REST_General($auth);
2
TvC

Scheint, dass die aktuellen Antworten alle veraltet sind. Wenn Sie Composer) verwenden, um die Abhängigkeiten Ihres Projekts zu verwalten, vorzugsweise mit drupal-composer/drupal-project , müssen Sie lediglich ein Paket in Ihrem Projektstamm anfordern composer.json Und laden Sie die Klassen dort, wo Sie sie benötigen.

$ cd MYPROJECT
$ composer require ramsey/uuid

Dann in Ihrem benutzerdefinierten Modul nur use es.

use Ramsey\Uuid\Uuid;

Damit Ihr benutzerdefiniertes Modul seinen eigenen composer.json Bereitstellt, können Sie wikimedia/composer-merge-plugin Zum composer.json Des Projektstamms und im "extra": {} Hinzufügen. Abschnitt konfigurieren Sie es so, dass es andere composer.json enthält, die sich in einem bestimmten Verzeichnismuster befinden.

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

Alles andere erledigt Drupal.

0
leymannx