Uso del caricamento automatico di Composer

Ho guardato in networking senza fortuna su questo problema. Sto usando il caricamento automatico del compositore con questo codice nel mio composer.json :

 "autoload": { "psr-0": {"AppName": "src/"} } 

Ma ho bisogno di caricare automaticamente a un livello superiore rispetto alla cartella del venditore.

Fare qualcosa come questo non funziona:

 "autoload": { "psr-0": {"AppName": "../src/"} } 

Qualcuno sa una correzione o come posso farlo?

Ogni pacchetto dovrebbe essere responsabile dell'autoloading stesso, cosa stai cercando di get con le classi di autoload che sono fuori dal pacchetto che definisci?

Una soluzione alternativa se è per l'applicazione stessa è aggiungere uno spazio dei nomi all'istanza del caricatore, qualcosa del genere:

 <?php $loader = require 'vendor/autoload.php'; $loader->add('AppName', __DIR__.'/../src/'); 

La documentazione del compositore afferma che:

Dopo aver aggiunto il field di caricamento automatico, è necessario rieseguire l'installazione per rigenerare il file vendor / autoload.php.

Supponendo che la directory "src" risieda allo stesso livello della dir "vendor":

  • src
    • Nome dell'applicazione
  • venditore
  • composer.json

la seguente configuration è assolutamente corretta:

 { "autoload": { "psr-0": {"AppName": "src/"} } } 

ma devi aggiornare di nuovo / installare le dependencies per farlo funzionare, ovvero eseguire:

 php composer.phar update 

Questo command aggiornerà il file "fornitore / compositore / autoload_namespaces.php" in modo che corrisponda alla tua configuration.

Esistono anche altri modi per utilizzare le funzioni di caricamento automatico del compositore. Modi che possono essere utili per caricare pacchetti senza spazi dei nomi o pacchetti forniti con una function di caricamento automatico personalizzata.

Ad esempio, se si desidera includere un singolo file che contiene anche una function di caricamento automatico, è ansible utilizzare la direttiva "file" come segue:

 "autoload": { "psr-0": { "": "src/", "SymfonyStandard": "app/" }, "files": ["vendor/wordnik/wordnik-php/wordnik/Swagger.php"] }, 

E all'interno del file Swagger.php abbiamo ottenuto:

 function swagger_autoloader($className) { $currentDir = dirname(__FILE__); if (file_exists($currentDir . '/' . $className . '.php')) { include $currentDir . '/' . $className . '.php'; } elseif (file_exists($currentDir . '/models/' . $className . '.php')) { include $currentDir . '/models/' . $className . '.php'; } } spl_autoload_register('swagger_autoloader'); 

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

Altrimenti potresti voler usare un riferimento a una class:

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

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

Nota: durante i test, ricorda di avviare il command dump-autoload del compositore o non vedrai alcuna modifica!

 ./composer.phar dump-autoload 

Happy autoloading =)

A mio parere, la risposta di Sergiy dovrebbe essere la risposta selezionata per la domanda data. Sto condividendo la mia comprensione.

Stavo cercando di caricare automaticamente i miei file del pacchetto usando il compositore che ho sotto la struttura dir di seguito.

 <web-root> |--------src/ | |--------App/ | | | |--------Test/ | |---------library/ | |---------vendor/ | | | |---------composer/ | | |---------autoload_psr4.php | | | |----------autoload.php | |-----------composer.json | 

Sto usando le specifiche di autoloading di psr-4 .

Ho dovuto aggiungere le righe seguenti al compositore.json del progetto. Intendo posizionare i miei file di class all'interno di src / App, src / Test e directory della libreria.

 "autoload": { "psr-4": { "OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"] } } 

Questo è praticamente auto esplicativo. OrgName \ AppType \ AppName è il prefisso dello spazio dei nomi previsto. ad es. per l'utente di class in src / App / Controller / Provider / User.php

 namespace OrgName\AppType\AppName\Controller\Provider; // namespace declaration use OrgName\AppType\AppName\Controller\Provider\User; // when using the class 

Notate anche "src / App", "src / Test" .. sono dalla vostra web-root che è where si trova il vostro compositore.json. Niente a che vedere con la directory del venditore. dai un'occhiata a vendor / autoload.php

Ora se il compositore è installato correttamente tutto ciò che è necessario è l'aggiornamento #composer

Dopo l'aggiornamento del compositore, le mie classi sono state caricate correttamente. Quello che ho osservato è che il compositore sta aggiungendo una row in vendor / compositore / autoload_psr4.php

 $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return arrays( 'Monolog\\' => arrays($vendorDir . '/monolog/monolog/src/Monolog'), 'OrgName\\AppType\\AppName\\' => arrays($baseDir . '/src/App', $baseDir . '/src/Test', $baseDir . '/library'), ); 

Ecco come compongono le mappe del compositore. Per la mapping psr-0 è in vendor / compositore / autoload_classmap.php

La configuration del caricamento automatico inizia sotto la dir del venditore. Quindi potresti voler cambiare la dir del venditore, ad es

 { "config": { "vendor-dir": "../vendor/" }, "autoload": { "psr-0": {"AppName": "src/"} } } 

O non è ansible nel tuo progetto?

Basta creare un link simbolico nella cartella src per lo spazio dei nomi che punta alla cartella contenente le classi …

 ln -s ../src/AppName ./src/AppName 

Il tuo autoload in compositore avrà lo stesso aspetto …

 "autoload": { "psr-0": {"AppName": "src/"} } 

E le tue classi con nomi degli AppName inizieranno una directory dalla cartella di lavoro corrente in una cartella src ora … dovrebbe funzionare.