2016-09-19 3 views
2

У меня есть один пакет в проекте, который Автозагружаемый использованием композитор и composer.json запись выглядит следующим образом:PSR4 автоматической загрузки без композитора

"autoload": { 
     "psr-4": { 
     "CompanyName\\PackageName\\": "packages/package-folder/src/" 
    } 
    } 

Теперь я копирую это на другой проект, который не использует композитор , Как я могу автозагрузить этот же пакет там?

+0

Если у вас есть файл composer.json, вы можете использовать композитор только для поиска пакетов и загрузки их в свой проект. – Katie

+0

Но это не находится в репозитории композитора. Его настраиваемый репозиторий и автоматически загружается с использованием функции автозагрузки композитора. –

+0

Вы можете попробовать автозагрузку напрямую: http://php.net/manual/en/function.autoload.php – Katie

ответ

11

Вы должны прочитать композитор и загрузить классы самостоятельно для каждого пространства имен, определенного в composer.json.

Вот как:

function loadPackage($dir) 
{ 
    $composer = json_decode(file_get_contents("$dir/composer.json"), 1); 
    $namespaces = $composer['autoload']['psr-4']; 

    // Foreach namespace specified in the composer, load the given classes 
    foreach ($namespaces as $namespace => $classpaths) { 
     if (!is_array($classpaths)) { 
      $classpaths = array($classpaths); 
     } 
     spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) { 
      // Check if the namespace matches the class we are looking for 
      if (preg_match("#^".preg_quote($namespace)."#", $classname)) { 
       // Remove the namespace from the file path since it's psr4 
       $classname = str_replace($namespace, "", $classname); 
       $filename = preg_replace("#\\\\#", "/", $classname).".php"; 
       foreach ($classpaths as $classpath) { 
        $fullpath = $dir."/".$classpath."/$filename"; 
        if (file_exists($fullpath)) { 
         include_once $fullpath; 
        } 
       } 
      } 
     }); 
    } 
} 

loadPackage(__DIR__."/vendor/project"); 

new CompanyName\PackageName\Test(); 

Конечно, я не знаю, классы, которые имеют в PackageName. /vendor/project - где клонирована или загружена ваша внешняя библиотека. Здесь вы найдете файл composer.json.

Примечание: это работает только для автозагрузки psr4.

EDIT: Добавление поддержки нескольких для одного к классам имен

EDIT2: Я создал Github repo обрабатывать этот код, если кто-то хочет, чтобы улучшить его.

2

Да, этот вопрос составляет 6 месяцев, однако я просто использовал следующее. Я только что нашел следующее решение проблемы. Я просто выполнил команду composer dump-autoload -o в папке проекта. После этого мне просто пришлось загрузить содержимое папки ./vendor/composer и /vendor/autoload.php на сервер, и он снова работал. Это полезно, если вы не можете запустить композитор на сервере.

+0

Это не совсем тот же вопрос. OP попросил обработать автозагрузку от composer.json без составителя вообще. – Thibault

Смежные вопросы