2015-10-13 30 views
5

Ich habe ein Projekt mit mehreren Unterordnern. In einem der Ordner befinden sich einige "Addons". Alle diese Addons haben einen composer.json und einen Vendor-Ordner. Ich wollte jetzt mein eigenes Addon erstellen und einen neuen Ordner erstellen und ein composer.json in dieses Verzeichnis einfügen. composer install funktioniert ohne Probleme, aber wenn ich die Installation irgendwie mein Addon Ich erhalte den FehlerAufruf zu undefinierter Methode 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() 

Was dieses Problem verursachen könnte? Ich habe bereits composer dump-autoload und composer global update, weil ich diese Lösungen im Internet gefunden habe, aber es funktioniert immer noch nicht. Muss ich etwas Spezielles tun, damit es in Unterordnern funktioniert?

Dies ist derzeit mein composer.json

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

Ich weiß nicht, ob das hilft, aber wenn ich den Lader var_dump Dies ist das Ergebnis

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) { 
    } 
} 

Danach wird die $loader->setPsr4 Methode ist gerufen und ich bekomme den fatalen Fehler.

Die seltsame Sache ist, dass bei der Verwendung classmap anstelle von psr-4 für Autoloading, es funktioniert ohne Probleme.

+0

Was ist Ihre Komponist-Version? Was ist das Ergebnis von 'composer --version'? –

+0

Ich habe 'Composer Version 1.0-dev (6eb50623e6e00bac4ed893802836e50b62c83434) 2016-02-08 19: 03: 10' und das gleiche Problem – OzzyCzech

Antwort

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

    "classmap": ["src/"] 
} 

Versuchen Sie dies!

+3

Bitte bearbeiten Sie Ihren Beitrag und erklären, warum das funktioniert. –

1

In meinem Fall war das Problem mit mehreren Version ClassLoader.php Datei im Code. erfordern ClassLoader.php mit Folge Code in composer/autoload_real.php Datei

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

Dann, wenn Sie rufen wieder require __DIR__ . '/autoload.php'; Klasse bereits geladen Lassen Sie mich meinen Fall erklären, ich mehrere Wordpress-Plugins mit Composer innen haben und wie sie zuerst von ihnen initialisiert und haben verschiedene Schnittstelle (fehlende Funktionen in unserem Fall).

Sie können es mit Reflexion überprüfen, folgen Sie den Code zu composer/autoload_real.php direkt nach new \Composer\Autoload\ClassLoader();

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

In meinem Fall hinzufügen wurde Klasse aus unterschiedlichen Quell dann aktuellen Arbeitsverzeichnis geladen.

Lösung:

  • Download neueste Version des Komponisten mit composer self-update
  • besuchen dann alle Ordner mit composer.json in Ihrem Projekt und rufen composer update
  • dann composer global update laufen und prüfen, ob das helfen ist