2015-10-13 1 views
5

У меня есть проект с несколькими подпапками. В одной из папок есть несколько «аддонов». У всех этих аддонов есть композитор.json и папка поставщика. Теперь я хотел создать свой собственный аддон и создать новую папку и поместить composer.json в этот каталог. composer install работает без каких-либо проблем, но когда я как-то установка моего аддона я получаю ошибкуЗвонок на неопределенный метод 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() 

Что может вызвать эту проблему? Я уже делал composer dump-autoload и composer global update, потому что нашел эти решения в Интернете, но он по-прежнему не работает. Должен ли я делать что-то особенное, чтобы оно работало в подпапках?

Это в настоящее время мой composer.json

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

Я не знаю, если это помогает, но когда я var_dump загрузчик это результат

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

После того, что метод $loader->setPsr4 является и я получаю фатальную ошибку.

Странная вещь заключается в том, что при использовании classmap вместо psr-4 для автозагрузки он работает без проблем.

+0

Какова ваша версия для композитора? Каков результат 'composer -version'? –

+0

У меня есть 'Composer version 1.0-dev (6eb50623e6e00bac4ed893802836e50b62c83434) 2016-02-08 19: 03: 10' и такая же проблема – OzzyCzech

ответ

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

    "classmap": ["src/"] 
} 

Попробуйте это!

+3

Пожалуйста, отредактируйте ваше сообщение и объясните, почему это работает. –

1

В моем случае была проблема с несколькими версиями файла ClassLoader.php в коде. Позвольте мне объяснить мой случай, у меня есть несколько плагинов WordPress с Composer внутри и как они инициализируются первые из них требуют ClassLoader.php с последующим кодом в composer/autoload_real.php файле

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

Тогда при вызове снова require __DIR__ . '/autoload.php'; класс уже загружен и может иметь другой интерфейс (отсутствующие функции в нашем случае).

Вы можете проверить это с отражением, добавить последующий код composer/autoload_real.php сразу после new \Composer\Autoload\ClassLoader();

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

В моем случае был загружен класс из другого источника, то текущий рабочий реж.

Решение:

  • скачать последнюю версию композитора с composer self-update
  • затем посетить все папки с composer.json в вашем проекте и вызвать composer update
  • затем запустить composer global update и проверить, если это поможет