2016-06-17 13 views
2

Ich fange gerade mit Komponist an. Ich möchte sicherstellen, dass ich richtig verstehe, was Composer macht, wenn es Pakete von Packagist mit den Standardeinstellungen von Composer herunterlädt und installiert. Ist das richtig:Komponist: Was ist der Unterschied zwischen Require und Autoloader?

  1. Die „Require“ -Abschnitt der composer.json Datei gibt die Pakete, die heruntergeladen und installiert von Packagist.Nur die im Abschnitt "Require" aufgeführten Pakete werden heruntergeladen und installiert.
  2. Während des Download- und Installationsprozesses in Schritt # 1 wird eine autoload_namespaces.php Datei im Standardordner vendor erstellt (der während des Herunterladens und der Installation im Stammverzeichnis des Projekts erstellt wird). Diese Datei enthält eine Namespacedefinition für jedes heruntergeladene und installierte Paket, das einem Ordner im Dateisystem zugeordnet ist.
  3. Die Klassen in den in Schritt 1 heruntergeladenen Dateien sind nur über autoload_namespaces.php's Namespaces zugänglich, WENN JEDE HERUNTERGELADENE DATEI EINE NAMESPACE DEFINITION ENTHÄLT DAS PASSIERT EINES VON autoload_namespaces.php's NAMESPACES. Wenn in einer heruntergeladenen Datei keine Namespacedefinition vorhanden ist, werden die Klassen in der Datei dem GLOBAL-Namespace zugewiesen.
  4. Der „Autoloader“ -Abschnitt der composer.json Datei wird nur verwendet, benutzerdefinierte Namespaces und Karte der benutzerdefinierten Namespaces in einen Ordner auf dem Dateisystem zu definieren. Heruntergeladen und installiert Paket Namespaces sind nur imautoload_namespaces.phpDatei und nicht in irgendeiner Weise durch die „Autoloader“ SECTION composer.json BETROFFEN, vorausgesetzt, dass ein Namespace IN DEM autoload_namespaces.php Datei nicht im dupliziert definiert composer.json "Autoloader" ABSCHNITT.

Ist mein Verständnis über die oben genannten Punkte in Ordnung? Wenn nicht, würdest du mich bitte korrigieren?

Dank im Voraus -

Antwort

1

Sie haben einige Dinge falsch.

ad 1 .:

Es gibt einen require-dev Abschnitt, der auch installiert werden, wenn Sie dies verhindern, indem die --no-dev Flag verwendet, wenn oder die Aktualisierung zu installieren. Beachten Sie auch, dass der Paketname nicht unbedingt mit einem auf Packagist veröffentlichten Inhalt verbunden ist. Sie können auch einen Abschnitt repositories haben, der auf alternative Quellen verweisen kann.

ad 2 .:

Die Erstellung von Dateien über den vendor/autoload.php ist intern Komponist, und Sie sollten nicht mit ihm verwirren. Der Composer liest die Definitionen aller autoload und autoload-dev Abschnitte (sofern nicht --no-dev angegeben wird) und kompiliert den entsprechenden Autoloader daraus. Dies beinhaltet die Hauptsoftware, die alle require und require-dev für andere Pakete enthält.

Die Zusammenstellung unterschiedlich verhalten, je nach Art der automatisch geladen, die definiert ist: PSR-4, PSR-0, classmap oder Dateien.3

ad .:

Wenn ein Paket keinen autoload Abschnitt kann jeder Code nicht automatisch geladen werden. Unter der Annahme, dass der Autor eines Pakets alles richtig gemacht hat, kann man davon ausgehen, dass das Autoloading je nach Art des Autoloading (PSR-4, PSR-0, Classmap oder Dateien) korrekt abläuft.

Ein Paket kann mehrere Einträge zum Autoloading enthalten und für mehrere Namespaces verantwortlich sein. Die Einträge in autoload_namespaces.php sind hauptsächlich irrelevant Komponist autoloading im Allgemeinen zu verstehen: Ein Paket definiert eine automatische Laden, eine Software, das Paket erfordert, umfasst vendor/autoload.php, und der Entwickler kennt aus der Dokumentation, dass es eine Klasse ist WhateverNamespace\Foo und einfach verwendet es: $class = new WhateverNamespace\Foo() oder use WhateverNamespace\Foo; $class = new Foo() .

Nehmen Sie keine Verbindung vom Paketnamen zum Namespace oder vom Namespace zum Ordnernamen an. Alles kann anders benannt werden (obwohl es verwirrend ist, was selten eine gute Idee ist), wenn es um Composer geht, gibt es keine erzwungenen Regeln, die sagen, dass ein Paket mit dem Namen GreatVendor/Awesome den Namespace GreatVendor\Awesome oder ein beliebiges anderes Ordnerlayout verwenden muss. Mit Klassenmaps kann jede Klasse in jeder Datei gehostet werden, mehr als eine Klasse kann in einer einzigen Datei gehostet werden, und Code kann weiterhin unter Verwendung von include/require(_once) eingebunden werden.

Der allgemeine Fall wäre, dass jedes neuere Paket bei PSR-4 oder mindestens PSR-0 bleiben und Namespaces verwenden wird. Beachten Sie jedoch, dass der Ursprung dieses Codes vom Code selbst und nicht vom Composer stammt. Composer führt nur die definierte Autoload-Definition aus und verhält sich entsprechend, es wird sich nicht mit wechselnden Namespaces oder ähnlichem stören. Es ist immer noch basic PHP, mit dem zusätzlichen Vorteil einer gemeinsamen Schnittstelle, die einem generischen Autoloader sagt, wie man eine Klasse findet, wenn sie benötigt wird.

ad 4 .:

Es gibt keinen "eigenen Namensraum". Was soll "Brauch" hier bedeuten? Der Abschnitt autoload muss mit dem geschriebenen Code übereinstimmen. Sie können die Namespaces im Code nicht mithilfe von Composer in andere ändern.

autoload_namespaces.php ist nicht die einzige Quelle für Autoload-Definitionen.

Composer wird doppelte Namespace-Einträge gut behandeln. Es muss fehlschlagen, wenn doppelte Klassen definiert sind, aber solange es nur eine Überlappung für das Namespacepräfix gibt (wie GreatVendor wird von den beiden Paketen GreatVendor\Cache und GreatVendor\Db verwendet), wird Composer sie auseinander halten.

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, mich aufzuklären, was ich an Composer vermisst habe! Ich werde diese Frage noch ein paar Tage geben. Ich vermute jedoch, dass ich Ihre Antwort als bevorzugte Antwort auswählen werde. –

+0

Danke nochmal @Sven für die Antwort. Es war sehr hilfreich! –