So definieren Sie den Pfad zu autoload.php mit Composer
-
21-12-2019 - |
Frage
Ich habe ein Komponistenprojekt, nennen wir es MyVendor\Database
.Dieses Projekt verwendet Composer und Autoloading.Es gibt mehrere Dateien in diesem Projekt, die Folgendes enthalten:
require_once __DIR__."/../vendor/autoload.php";
um das automatische Laden zu nutzen.
Es funktioniert alles großartig, bis ich es hinzufüge MyVendor\Database
in einem anderen Projekt.
Ich habe ein anderes Projekt, nennen Sie es MyVendor\CoolPackage
Das benötigt MyVendor\Database
.
Ich führe Composer Install aus CoolPackage
und es wird heruntergeladen MyVendor\Database
in den Vendor-Ordner.
Das Problem von hier aus sind jedoch meine darin enthaltenen Dateien vendor\MyVendor\Database
scheitern, weil sie anrufen require_once __DIR__."/../vendor/autoload.php"
, aber darin befindet sich kein Vendor-Ordner \vendor\MyVendor\Database
.
Lösung
In deinem composer.json
Sie definieren das automatische Ladeschema.Aus Gründen, die Sie jetzt selbst herausgefunden haben, ist es keine gute Idee, das automatische Laden von Composer innerhalb einer der Dateien aufzurufen, die nicht nur innerhalb dieser Anwendung oder dieses Moduls, sondern auch in jeder anderen Anwendung automatisch geladen werden sollen.
Grundsätzlich sollten die Dateien in jedem Composer-Projekt basierend auf der Definition von PSR-0 oder 4 Autoloading aufgeteilt werden:Sie führen entweder NUR die Deklaration von Klassen oder Funktionen OHNE Nebenwirkungen (wie die Ausführung von Code) durch, oder sie führen Code aus, ohne Klassen oder Funktionen zu definieren.Nur die früheren Dateien können automatisch geladen werden (mit Ausnahme von Funktionen, die immer nur durch Laden der Datei, die sie enthält, mit a deklariert werden könnten files
Autoload-Abschnitt), letzterer sollte NICHT automatisch geladen werden.
Und dann sollte es relativ einfach werden:Alle Klassen, die automatisch geladen werden können, können auch verwendet werden, wenn diese Komponente in eine andere Anwendung eingebunden wird.Alles andere, was keine Klasse ist, kann nicht direkt verwendet werden.