2017-07-07 4 views
6

Ich arbeite gerade an einem Laravel-Projekt, das auf Klassen aus seinem übergeordneten Verzeichnis zugreifen muss.Composer autoload - Klasse aus dem übergeordneten Verzeichnis laden

composer.json> PSR-4:

"psr-4": { 
     ... 
     "ModuleA\\": "../ModuleA/baseObjects", 
     "ModuleB\\": "../ModuleB/baseObjects" 
    } 

Beispiel Dateistruktur:

/var/www 
+- /xxx (project) 
    +- /ModuleA 
     +- /baseObjects 
      - configClass.inc 
    +- /ModuleB 
     +- /baseObjects 
      - configClass.inc 
    +- /laravel 
     - composer.json 

Ich betreibe composer dump-autoload aber das Projekt kann immer noch nicht ModuleA\configClass weder ModuleB\configClass finden.

Außerdem in meinem autoload_psr4.php, wird die oben folgend verwiesen:

'MobuleA\\' => array($baseDir . '/../MobuleA/baseObjects') 
'MobuleB\\' => array($baseDir . '/../MobuleB/baseObjects') 

Vielen Dank im Voraus.

+0

try "": "src (Hauptordner i seine erraten) /" keine Notwendigkeit, die Module zu initialisieren nur Ordner hinzufügen und/ – DaAmidza

Antwort

0

versuchen es:

"psr-4": { 
     ... 
     "ModuleA\\": "ModuleA/baseObjects", 
     "ModuleB\\": "ModuleB/baseObjects" 
} 
+0

Es funktioniert nicht, der Code oben versucht, es im aktuellen Verzeichnis zu finden, versuche ich auf das übergeordnete Verzeichnis zuzugreifen. – dzerow

0

Nach dieser answer Sie es in der Datei index.php hinzufügen:

$loader = require 'vendor/autoload.php'; 
$loader->add('Namespace\\Somewhere\\Else\\', __DIR__); 
$loader->add('Namespace\\Somewhere\\Else2\\', '/var/www/html/xxx'); 
4

PSR-4 erfordert die geladenen Dateien eine Klasse Namensraum zu haben, und Die Namespace-Struktur muss der Verzeichnisstruktur entsprechen, bezogen auf das in der Konfiguration definierte "Basisverzeichnis" (http://www.php-fig.org/psr/psr-4/).

in Datei So sollte /var/xxx/ModuleA/baseObjects/configClass.inc sein die Klasse

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

Dann in var/www/laravel/composer.json Sie

"psr-4": { 
     "App\\": "app/", 
     "ModuleA\\": "../ModuleA" 
    } 

haben könnten, das heißt: „Verzeichnis ../ModuleA die Wurzel für ModuleA Namensraum sein sollte, dann subnamespaces folgen indem ich die Unterverzeichnisse von dort abgleiche ".

1

Das Problem, das auftritt, bezieht sich nicht auf übergeordnete Verzeichnisse. In der Tat ist Ihre Composer.json-Autoload-Konfiguration für Ihre Verzeichnisstruktur korrekt.

Das Problem ist die Dateierweiterung .inc, die mit der PSR-4-Spezifikation nicht kompatibel ist. Mehr Infos hier: How To Make Composer (PSR-4) To Work With ".class.php" Extension?

Wenn Sie nicht Ihren Quellcode aktualisieren können die PSR-4-Spezifikation entsprechen, können Sie Class Mapping:

Die classmap Referenzen alle kombiniert werden, während der Installation/Update, in einem einzigen key => value array, das sich in der generierten Datei vendor/composer/autoload_classmap.php befindet. Diese Karte wird erstellt, indem nach Klassen in allen .php und .inc Dateien in den angegebenen Verzeichnissen/Dateien gesucht wird.

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

So Ihre Konfiguration könnte wie folgt aussehen:

"autoload": { 
    "classmap": [ 
     "../ModuleA/baseObjects", 
     "../ModuleB/baseObjects" 
    ] 
} 

Denken Sie daran, wenn Sie Klassenzuordnung verwenden, müssen Sie composer dump-autoload jederzeit Sie composer.json ändern, fügen Sie eine Klasse, ändern, um eine Klasse Namen laufen/filename/path usw.

extra: wie @alepeino wies darauf hin, autoloader optimization verwendet, wird eine Klasse Karte von jedem PSR-0 und PSR-4 automatisch geladen Definitionen, unter Verwendung der gleichen zugrunde liegenden Code, dasserzeugenAutoload verwendet. Dadurch können Sie den Autoloader PSR-4 und die Erweiterung .inc verwenden. Dies erfordert immer noch, dass Sie jedes Mal, wenn Sie eine Datei ändern, composer dump-autoload --optimize ausführen, genau wie classmap.

Beste Empfehlung: Ändern Sie Ihren Quellcode, um den PSR-4-Spezifikationen zu folgen, und verwenden Sie die Erweiterung .php.

Nächste beste, wenn Sie das nicht tun können: Verwenden Sie classmap für Autoloading.

+0

Ich dachte, ich zuerst, also habe ich es versucht, und festgestellt, dass, obwohl die PSR-4-Spezifikation sagt, dass die Dateierweiterung "muss" sein ".php", Composer tatsächlich eine ". Inc" korrekt geladen. – alepeino

+0

Ich möchte, dass der von Ihnen verwendete Code zum Testen getestet wird. Ich habe ein grundlegendes PSR-4-Setup erstellt, das der fraglichen Verzeichnisstruktur entspricht, und dann eine der Klassenerweiterungen in .inc geändert und es konnte nicht mehr gefunden werden. Der [Autoloader legt explizit die Erweiterung fest] (https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351). Vielleicht ein Unterschied in der Composer-Version? –

+0

Es stellt sich heraus, dass ich meinen ersten Test in einem Laravel-Projekt gemacht habe, dann wieder in einem nackten neuen Ad-hoc-Projekt versucht und nicht funktionieren würde. Mein original composer.json hatte 'optimize-autoloader' an. Siehe https://github.com/alepeino/composer-optimize – alepeino

0

Verwenden Sie Classmap Autoload wird dieses Problem lösen.

{ 
... 
"autoload": { 
     "classmap": ["ModuleA/", "ModuleB/"] 
    } 
} 

Es könnte mit PSR-4 verwendet werden

{ 
    ... 
    "autoload": { 
      "psr-4": { 
       "Acme\\": "src/Acme/" 
      }, 
      "classmap": ["ModuleA/", "ModuleB/"] 
     } 
    } 

Ref: https://getcomposer.org/doc/04-schema.md#classmap

Verwandte Themen