So laden Sie Klassen automatisch aus einer PHP-Bibliothek eines Drittanbieters

7

Ich möchte eine PHP-Bibliothek eines Drittanbieters 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

Die offizielle Drupal 8-Dokumentation befasst sich nicht wirklich mit komplexeren Namespace-Szenarien.

Roger
quelle
Diese andere Frage ist ein Jahr alt. In Drupal 8 kann sich in einem Jahr viel ändern. Sie sind sich also nicht sicher, wo Sie sie beantworten sollen. Composer Manager ist eine Möglichkeit. Sie können eine fest codierte Abhängigkeit auch vermeiden, indem Sie sie mit Ihrem eigenen Autoloader wie github.com/amateescu/search_api_solr versenden . Oder Sie könnten sogar Vollkomponist werden und Drupal und die Module mit Komponist bauen, ähnlich wie Drush Make. Ich kann momentan keine gute Ressource finden, aber die Leute arbeiten daran, dies zu erreichen. Der Vorteil ist, dass es ihre composer.json-Dateien automatisch aufnimmt und alles kombiniert.
Berdir
@Berdir oder @Clive können Sie mir sagen, wo wir mit diesem in 8.1 sind. Hier steht , dass es in meinen benutzerdefinierten Modulen unterstützt werden soll, aber ich kann keinen Weg finden, dies zum Laufen zu bringen. Ich habe die requireAnweisung in meiner Datei composer.json in meinem Modulordner abgelegt, composer installaber Drupal sagt immer noch, dass er meine Bibliothek nicht finden kann.
Guillaume Bois
Sie müssen Ihr Modul auch mit Composer installieren, damit es Ihre Abhängigkeiten kennt. Siehe drupal.org/node/2404989 . Wenn es sich um ein benutzerdefiniertes Modul handelt, müssen Sie diese selbst zur Hauptkomponente composer.json hinzufügen.
Berdir
@berdir Wenn ich mich nicht irre, installiert Composer kein Modul in Drupal, sondern lädt einfach die Bibliotheken herunter. Ich kann nicht verstehen, warum ich meine benötigten Bibliotheken in der composer.json des Moduls UND in der aus dem Stammverzeichnis hinzufügen muss. Und wenn ich es in die Datei root composer.json einfügen muss, ändere ich das Git des Drupal und muss einen anderen Zweig des Git des Drupal nur für diese Datei verwalten. Drupal sollte in der Lage sein, alle Bibliotheken von allen composer.json einzuschließen, nicht nur die von der Wurzel.
Guillaume Bois

Antworten:

4

Drupal verwendet Composer, um die Bibliotheken von Drittanbietern (Symfony, Guzzle usw.) zu verwalten. Das Problem ist, dass Drupal den Herstellerordner in das Kernverzeichnis versioniert hat. Dies ist ein Problem, da Sie beim Hinzufügen einer neuen Bibliothek im Root-Composer das Herstellerverzeichnis und die Datei composer.json / composer.lock ändern. Wenn Drupal eine neue Version veröffentlicht, werden Ihre Änderungen gelöscht.

Das Composer Manager- Modul 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 dabei ist nur, 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 der Middleware aufgerufen, sodass diese Bibliothek in der Middleware-Ebene nicht verfügbar ist.

In den meisten Fällen ist das Composer Manager-Modul 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 .

Maus
quelle
Bitte beachten Sie, dass ab Drupal 8.1 kein Composer Manager mehr benötigt wird. Die empfohlene Methode besteht darin, die Datei composer.json zu ändern, die mit drupal in drupal root geliefert wird. Kasse github.com/drupal-composer/drupal-scaffold .
Pwaterz
Es wird nicht empfohlen, die Erstellung in einem Modulverzeichnis zu starten. Es ist besser, die Root-Composer-Datei so zu ändern, dass sie die Abhängigkeit enthält. Und seit kurzem ist es sogar möglich, Drupal-Module in der Root-Composer-Datei zu benötigen, wodurch auch alle Abhängigkeiten dieses Moduls installiert werden.
Neograph734
2

Ich habe die Datei composer.json im Stammverzeichnis meines Drupal-Projekts und in dem Modul bearbeitet, das auf der Bibliothek basiert. Dann habe ich die Hauptklasse mit einem 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);
TvC
quelle
1
Ich denke, Sie mussten dies nur tun, weil Sie campaignmonitor/createsend-phpsich nicht an die PSR-0- oder PSR-4-Standards halten, weil es so alt ist, dass es geschrieben wurde, bevor diese Standards übernommen wurden, und Sie daher den Autoloader nicht verwenden können. Diese Antwort ist ziemlich spezifisch für diese Bibliothek, aber Sie sollten in Ihrer Antwort genauer erläutern, warum Sie `` (aufgrund von Namespaces) hinzufügen mussten und warum dies für Bibliotheken, die so alt sind, erforderlich sein kann.
mradcliffe
0

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

$ cd MYPROJECT
$ composer require ramsey/uuid

Dann in Ihrem benutzerdefinierten Modul genau das useRichtige.

use Ramsey\Uuid\Uuid;

Damit Ihr benutzerdefiniertes Modul ein eigenes Modul bereitstellt composer.json, können Sie es wikimedia/composer-merge-pluginzu Ihrem Projektstamm hinzufügen composer.jsonund im "extra": {}Abschnitt so konfigurieren, dass es andere Elemente enthält, die composer.jsonsich in einem bestimmten Verzeichnismuster befinden.

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

Alles andere erledigt Drupal.

Leymannx
quelle