2015-10-13 15 views
5

Ho un progetto con più sottocartelle. In una delle cartelle sono alcuni "addons". Tutti questi componenti aggiuntivi hanno un compositore.json e una cartella del venditore. Ora volevo creare il mio addon personale e creato una nuova cartella e mettere un composer.json in quella directory. composer install funziona senza problemi, ma quando sono in qualche modo l'installazione di mio addon sto ottenendo l'erroreChiamata a metodo non definito Composer \ Autoload \ ClassLoader :: setPsr4()

FastCGI: server "/fcgi-bin-php5-fpm-ezi" stderr: PHP message: PHP Fatal error: Call to undefined method Composer\\Autoload\\ClassLoader::setPsr4() 

Che cosa potrebbe causare questo problema? Ho già fatto composer dump-autoload e composer global update, perché ho trovato queste soluzioni su Internet, ma ancora non funziona. Devo fare qualcosa di speciale per farlo funzionare nelle sottocartelle?

Questo è attualmente il mio composer.json

{ 
    "name": "namespace/projectname-addonname", 
    "autoload": { 
    "psr-4": { 
     "namespace1\\namespace2\\namespace3\\" : "src" 
    } 
    } 
} 

Non so se questo aiuta, ma quando ho var_dump il caricatore questo è il risultato

object(Composer\Autoload\ClassLoader)#138 (4) { 
    ["prefixes":"Composer\Autoload\ClassLoader":private]=> 
    array(0) { 
    } 
    ["fallbackDirs":"Composer\Autoload\ClassLoader":private]=> 
    array(0) { 
    } 
    ["useIncludePath":"Composer\Autoload\ClassLoader":private]=> 
    bool(false) 
    ["classMap":"Composer\Autoload\ClassLoader":private]=> 
    array(0) { 
    } 
} 

Dopo che il metodo è $loader->setPsr4 chiamato e sto ricevendo l'errore fatale.

La cosa strana è che quando si utilizza classmap anziché psr-4 per il caricamento automatico, funziona senza problemi.

+0

Qual è la versione del tuo compositore? Qual è il risultato di 'compositore --versione'? –

+0

Ho 'Composer versione 1.0-dev (6eb50623e6e00bac4ed893802836e50b62c83434) 2016-02-08 19: 03: 10' e lo stesso problema – OzzyCzech

risposta

2
"autoload": 
{ 
    "psr-4": 
    { 
    "namespace1\\namespace2\\namespace3\\" : "src" 
    }, 

    "classmap": ["src/"] 
} 

Prova questo!

+3

Si prega di modificare il tuo post e spiegare perché questo funziona. –

1

Nel mio caso si è verificato un problema con più versioni del file ClassLoader.php nel codice. Mi spiego il mio caso, ho più plugin Wordpress con il compositore dentro e il modo in cui vengono inizializzati prima di essi richiedono ClassLoader.php con il codice di seguito in composer/autoload_real.php file di

if ('Composer\Autoload\ClassLoader' === $class) { 
    require __DIR__ . '/ClassLoader.php'; 
} 

Poi, quando si chiama di nuovo require __DIR__ . '/autoload.php'; classe è già caricato e può avere interfaccia diversa (funzioni mancanti nel nostro caso).

è possibile verificare con la riflessione, aggiungere il codice sottostante per composer/autoload_real.php subito dopo new \Composer\Autoload\ClassLoader();

$reflector = new ReflectionClass('\\Composer\\Autoload\\ClassLoader'); 
die($reflector->getFileName()); 

Nel mio caso era di prima classe caricato da diversa fonte allora in corso dir di lavoro.

Soluzione:

  • scaricare la versione più recente del compositore con composer self-update
  • poi visitare tutte le cartelle con composer.json nel progetto e chiamare composer update
  • quindi eseguire composer global update e verificare se questo è aiutare
Problemi correlati