2017-07-07 47 views
6

Obecnie pracuję nad projektem Laravel, który musi uzyskać dostęp do klas z katalogu nadrzędnego.Automatyczne ładowanie kompozytora - klasa obciążenia z katalogu nadrzędnego

composer.json> PSR-4:

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

Przykład struktury pliku:

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

biegnę composer dump-autoload ale projekt nadal nie może znaleźć ModuleA\configClass ani ModuleB\configClass.

Ponadto, w moim autoload_psr4.php, powyższa zostaje określany następująco:

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

Z góry dziękuję.

+0

try "": "src (główny folder, chyba jego) /" nie ma potrzeby, aby zainicjować moduły tylko dodaj folder i/ – DaAmidza

Odpowiedz

0

spróbować:

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

To nie działa, powyższy kod próbuje znaleźć go w bieżącym katalogu, próbuję uzyskać dostęp do katalogu nadrzędnego. – dzerow

0

Według tego answer można go dodać w pliku index.php:

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

PSR-4 wymaga, aby załadowane pliki mieć klasę przestrzeni nazw, a struktura obszaru nazw musi się zgadzać ze strukturą katalogów względem "katalogu podstawowego" zdefiniowanego w konfiguracji (http://www.php-fig.org/psr/psr-4/).

Więc w pliku /var/xxx/ModuleA/baseObjects/configClass.inc powinna być klasa

namespace ModuleA\baseObjects; 

class configClass { 
    ... 
} 

Następnie w var/www/laravel/composer.json można mieć

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

Co oznacza: „Katalog ../ModuleA powinien być root ModuleA nazw, a następnie subnamespaces przez dopasowywanie tam podkatalogów ".

1

Występujący problem nie jest związany z katalogami macierzystymi. W rzeczywistości konfiguracja autoloadowania Composer.json jest poprawna dla struktury katalogów. To jest rozszerzenie pliku .inc, które jest niezgodne ze specyfikacją PSR-4. Więcej informacji tutaj: How To Make Composer (PSR-4) To Work With ".class.php" Extension?

Jeśli nie możesz zaktualizować swój kod źródłowy, aby dopasować PSR-4 specyfikację, można użyć Class Mapping:

wszystkie odniesienia classmap są łączone podczas instalacji/aktualizacji na pojedynczym key => tablica wartości, którą można znaleźć w wygenerowanym pliku vendor/composer/autoload_classmap.php. Ta mapa jest budowana przez skanowanie klas dla wszystkich plików .php i .inc w podanych katalogach/plikach.

Możesz użyć obsługi generowania map klasy, aby zdefiniować automatyczne ładowanie dla wszystkich bibliotek, które nie są zgodne z PSR-0/4. Aby to skonfigurować, określ wszystkie katalogi lub pliki do wyszukiwania klas.

Więc twój config może wyglądać następująco:

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

Pamiętaj, że jeśli używasz mapowanie klasy, trzeba uruchomić composer dump-autoload w dowolnym momencie zmienić composer.json, dodać klasę, zmodyfikować klasę nazwy/nazwa pliku/ścieżka itp

Extra: jak podkreślił @alepeino korzystając autoloader optimization wygeneruje mapę klasy od wszelkich definicji PSR-0 i PSR-4 autoLoad, używając tego samego kodu bazowego że classmap używa autoload. Pozwoli to na użycie autoloadera PSR-4 i rozszerzenia .inc. Będzie to jednak wymagało uruchomienia composer dump-autoload --optimize za każdym razem, gdy zmienisz plik, tak jak w mapie klasowej.

Najlepsza rekomendacja: zmień kod źródłowy zgodnie ze specyfikacją PSR-4 i użyj rozszerzenia .php.

Dalej najlepiej, jeśli nie możesz tego zrobić: do automatycznego ładowania użyj classmap.

+0

Myślałem, że najpierw, więc spróbowałem i okazało się, że chociaż specyfikacja PSR-4 mówi, że rozszerzenie pliku "MUSI" być ".php", to kompozytor właściwie załadował ".inc" poprawnie. – alepeino

+0

Chciałbym zobaczyć kod używany do testowania. Zrobiłem podstawową konfigurację PSR-4 pasującą do danej struktury katalogów, a następnie zmieniono jedno z rozszerzeń klas na .inc i nie można go było już znaleźć. [Autoloader jawnie ustawia rozszerzenie] (https://github.com/composer/composer/blob/e42e1156d51ca5494b058b1a7b480bc703c4f57a/src/Composer/Autoload/ClassLoader.php#L351). Być może różnica w wersji Composer? –

+0

Okazuje się, że zrobiłem mój pierwszy test w projekcie Laravel, a potem spróbowałem go w nowym projekcie ad-hoc i nie zadziałał. Mój oryginalny composer.json miał 'optimize-autoloader' on. Zobacz https://github.com/alepeino/composer-optimize – alepeino

0

Skorzystaj z automatycznego ładowania mapy klasowej, aby rozwiązać ten problem.

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

To może być używany z PSR-4

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

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