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.
require
Anweisung in meiner Datei composer.json in meinem Modulordner abgelegt,composer install
aber Drupal sagt immer noch, dass er meine Bibliothek nicht finden kann.Antworten:
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 .
quelle
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:
Dann bemerkte ich ein Problem beim Instanziieren eines Objekts der Klasse:
Anscheinend müssen Sie also ein '\' hinzufügen, z.
quelle
campaignmonitor/createsend-php
sich 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.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 anforderncomposer.json
und dann die Klassen dort laden, wo Sie sie benötigen.Dann in Ihrem benutzerdefinierten Modul genau das
use
Richtige.Damit Ihr benutzerdefiniertes Modul ein eigenes Modul bereitstellt
composer.json
, können Sie eswikimedia/composer-merge-plugin
zu Ihrem Projektstamm hinzufügencomposer.json
und im"extra": {}
Abschnitt so konfigurieren, dass es andere Elemente enthält, diecomposer.json
sich in einem bestimmten Verzeichnismuster befinden.Alles andere erledigt Drupal.
quelle