2016-04-21 8 views
2

Ich habe ein Problem mit Composer Auto Loader. Derzeit arbeite ich an einer Anwendung, die vor etwa 10 Jahren entwickelt wurde. Die Ordnerstruktur von 2 Bibliotheken, die derzeit im Projekt verwendet werden, entspricht nicht den automatischen Laderegeln psr0 und psr4.Composer mit Dateien ohne Psr0 und Psr4 Autoloading (Symfony-Projekt)

Die Struktur nach dem Komponisten sieht wie folgt installieren

Beispiel 1

Ordnerpfad:/Verkäufer/AppBook/ORS/Klasse/Modell/Land

Dateiname: class.Country.php

PHP Klassenname: Land

Beispiel 2

Ordnerpfad:/Verkäufer/AppBook/ORS/Klasse/Modell/Land

Dateiname: class.CountryCollection.php

PHP Klassenname: CountryCollection

Bitte geben Sie an, was ich tun soll, damit der Composer Auto Loader diese Dateien erkennt.

Vielen Dank im Voraus

Antwort

2

Von the docs:

Sie die classmap Generation Unterstützung automatische Laden für alle Bibliotheken definieren können, die PSR-0/4 nicht folgen. Um dies zu konfigurieren, geben Sie alle Verzeichnisse oder Dateien an, nach denen nach Klassen gesucht werden soll.

Beispiel:

{ 
    "autoload": { 
     "classmap": ["src/", "lib/", "Something.php"] 
    } 
} 

Sie noch composer.json auf Ihren alten Bibliotheken hinzufügen und classmap autoloading Typ für sie definieren.

+0

wenn ich Autoload im composer.json von Legacy-Bibliotheken es – shobekhan

+0

funktioniert hinzufügen, aber wenn ich in composer.json von meinem Projekt hinzufügen es funktioniert nicht „Repositorys“: [{ „type“: „Paket“ , "Paket": { "name": "shoaib/test", "type": "Paket", "Version": "Master", "Quelle": { "url": „https: //github.com/shobekhan/test.git ", " typ ":" git ", " referenz ":" master " }, " autoload ": { "classmap": ["Cache /"] } } ] – shobekhan

+0

Sie müssen den Abschnitt "autoload" in composer.json Ihres shoaib/test-Pakets einfügen. Alternativ, wenn Sie keine Kontrolle über das Paket haben, können Sie versuchen, es auf der obersten Ebene von composer.json zu definieren, aber ich bin mir nicht sicher, ob das funktionieren wird. –

0

Sie können diese Dateien umbenennen, um sie kompatibel zu PSR-4 zu machen (unwahrscheinlich, weil das die Verwendung von Namespaces erfordert - in 10 Jahre altem Code?) Oder PSR-0. Außerdem müssen Sie das explizite Laden dieser Dateien über include, include_once, require oder require_once entfernen, da sich die Dateinamen geändert haben.

PHP wird diese Klassen automatisch nach ihrem Klassennamen laden. Dies wird möglicherweise zu Problemen führen, wenn die Groß-/Kleinschreibung im Klassennamen nicht überall beachtet wird. Beispiel:

class UpperCase {} 

$a = new upperCase(); 

Das automatische Laden würde versuchen, eine Datei mit Endung upperCase.php zu finden, die das PSR-0 nicht übereinstimmen erforderlich UpperCase.php, so wird der Code fehlschlagen.Dies wird jedoch arbeiten, um die Situation zu machen nicht besser:

class UpperCase {} 

$b = new UpperCase(); 
$a = new upperCase(); 

Der Grund dafür ist, dass PHP-Klassennamen Groß- und Kleinschreibung behandelt, so dass, sobald eine Klasse geladen wird, kann man jeden Case in seinem Namen verwenden kann. Es ist nur das erste Vorkommen in Ihrem Code-Pfad, das übereinstimmen muss. Das Problem ist, wo das wirklich ist, also muss es überall richtig sein.

Ja, die Classmap-Funktion ist der einfachere Weg. Aber Sie möchten immer noch include/require Anrufe entfernen, um die Leistung ein wenig zu optimieren, so müssen Sie den Code trotzdem berühren. Und trotz seines Alters muss es beibehalten werden - warum also nicht vollständig und auf einen bekannten Autoloading-Standard umstellen. Es wird Ihnen auf lange Sicht helfen, wenn Sie PSR-0/4-kompatible Klassen und diesen alten Code parallel verwalten müssen.

+0

Ihre Idee ist eine bessere Lösung auf lange Sicht. – shobekhan