Использование автозагрузки Composer

Я смотрю вокруг сети, не повезло по этому вопросу. Я использую автозагрузку композитора с этим кодом в моем composer.json :

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

Но мне нужно автозагрузку на более высоком уровне, чем папка поставщика.

Выполнение чего-то подобного не работает:

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

Кто-нибудь знает какое-либо решение или как я могу это сделать?

Solutions Collecting From Web of "Использование автозагрузки Composer"

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

Один обходной путь, если это для вашего приложения, – это добавить пространство имен в экземпляр загрузчика, что-то вроде этого:

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

Документация композитора гласит, что:

После добавления поля автозагрузки вам необходимо повторно запустить установку, чтобы повторно создать файл vendor / autoload.php.

Предполагая, что ваш «src» dir находится на том же уровне, что и «vendor»:

  • ЦСИ
    • Имя приложения
  • продавец
  • composer.json

следующая конфигурация абсолютно правильная:

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

но вы должны повторно обновлять / устанавливать зависимости, чтобы заставить его работать для вас, то есть запустить:

 php composer.phar update 

Эта команда обновит файл «vendor / composer / autoload_namespaces.php», чтобы он соответствовал вашей конфигурации.

Существуют и другие способы использования функций автозагрузки композитора. Способы, которые могут быть полезны для загрузки пакетов без пространств имен или пакетов, которые поставляются с пользовательской функцией автозагрузки.

Например, если вы хотите включить один файл, который содержит функцию автозагрузки, вы также можете использовать директиву «файлы» следующим образом:

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

И внутри файла Swagger.php мы получили:

 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

В противном случае вы можете использовать ссылку classmap:

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

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

Примечание: во время тестов не забудьте запустить команду dump-autoload для композитора или вы не увидите никаких изменений!

 ./composer.phar dump-autoload 

Счастливая автозагрузка =)

На мой взгляд, ответ Сергия должен быть выбранным ответом на данный вопрос. Я разделяю свое понимание.

Я искал автозагрузку своих файлов пакетов с помощью композитора, который у меня есть в структуре dir, приведенной ниже.

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

Я использую автозагрузку psr-4 .

Пришлось добавить ниже строки к композитору проекта. Я намерен разместить файлы классов в каталоге src / App, src / Test и library.

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

Это в значительной степени объяснение себя. OrgName \ AppType \ AppName – это мой предполагаемый префикс пространства имен. например, для класса User 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 

Также обратите внимание на «src / App», «src / Test» .. из вашего веб-корня, где находится ваш composer.json. Ничего общего с продавцом. взгляните на поставщика / autoload.php

Теперь, если композитор установлен правильно, все, что требуется, – это #composer update

После обновления композитора мои классы загрузились успешно. Я заметил, что композитор добавляет строку в vendor / composer / autoload_psr4.php

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

Так композитор рисует карты. Для отображения psr-0 используется поставщик / композитор / autoload_classmap.php

Конфигурация автозагрузки запускается ниже каталога поставщика. Поэтому вам может потребоваться изменить каталог поставщика, например

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

Или это не возможно в вашем проекте?

Просто создайте символическую ссылку в своей папке src для пространства имен, указывающего на папку, содержащую ваши классы …

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

Ваша автозагрузка в композиторе будет выглядеть одинаково …

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

И ваши классы с именами в AppName запустит каталог из текущего рабочего каталога в папке src сейчас …, который должен работать.