Использование автозагрузки композитора
Я смотрю по сети без везения по этому вопросу. Я использую автозагрузку композитора с этим кодом в своем composer.json
:
"autoload": {
"psr-0": {"AppName": "src/"}
}
Но мне нужно автозагрузку на более высоком уровне, чем папка поставщика.
Выполнение чего-то подобного не работает:
"autoload": {
"psr-0": {"AppName": "../src/"}
}
Кто-нибудь знает исправление или как я могу это сделать?
Ответы
Ответ 1
Каждый пакет должен отвечать за самозагрузку, чего вы пытаетесь достичь с помощью автозагрузки классов, которые не указаны в пакете, который вы определяете?
Один обходной путь, если это для вашего приложения - добавить пространство имен в экземпляр загрузчика, например:
<?php
$loader = require 'vendor/autoload.php';
$loader->add('AppName', __DIR__.'/../src/');
Ответ 2
документация композитора гласит, что:
После добавления поля автозагрузки вам необходимо повторно запустить установку, чтобы повторно создайте файл vendor/autoload.php.
Предполагая, что ваш файл src находится на том же уровне, что и каталог "vendor":
- ЦСИ
- поставщика
- composer.json
следующая конфигурация абсолютно правильная:
{
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
но вы должны повторно обновить/установить зависимости, чтобы заставить его работать на вас, то есть запустить:
php composer.phar update
Эта команда обновит файл "vendor/composer/autoload_namespaces.php", чтобы он соответствовал вашей конфигурации.
Ответ 3
Существуют и другие способы использования функций автозагрузки композитора. Способы, которые могут быть полезны для загрузки пакетов без пространств имен или пакетов, которые поставляются с пользовательской функцией автозагрузки.
Например, если вы хотите включить один файл, который содержит функцию автозагрузки, вы также можете использовать директиву "файлы" следующим образом:
"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
Счастливая автозагрузка =)
Ответ 4
На мой взгляд, ответ Сергия должен быть выбранным ответом на данный вопрос. Я разделяю свое понимание.
Я искал автозагрузку моих файлов пакетов с помощью композитора, который у меня есть в структуре dir, приведенной ниже.
<web-root>
|--------src/
| |--------App/
| |
| |--------Test/
|
|---------library/
|
|---------vendor/
| |
| |---------composer/
| | |---------autoload_psr4.php
| |
| |----------autoload.php
|
|-----------composer.json
|
Я использую psr-4 спецификацию автозагрузки.
Пришлось добавить ниже строки к проекту composer.json. Я намерен разместить файлы классов в каталоге src/App, src/Test и library.
"autoload": {
"psr-4": {
"OrgName\\AppType\\AppName\\": ["src/App", "src/Test", "library/"]
}
}
Это в значительной степени объяснение себя. OrgName\AppType\AppName - это мой предполагаемый префикс пространства имен.
например, для класса User в 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
Теперь, если композитор установлен правильно, все, что требуется, это
Обновление # компоновщика
После обновления композитора мои классы загрузились успешно.
Я заметил, что композитор добавляет строку в 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 в vendor/composer/autoload_classmap.php
Ответ 5
Конфигурация автозагрузки начинается с каталога поставщика. Поэтому вам может потребоваться изменить каталог поставщика, например.
{
"config": {
"vendor-dir": "../vendor/"
},
"autoload": {
"psr-0": {"AppName": "src/"}
}
}
Или это не возможно в вашем проекте?
Ответ 6
Просто создайте символическую ссылку в своей папке src для пространства имен, указывающего на папку, содержащую ваши классы...
ln -s ../src/AppName ./src/AppName
Ваша автозагрузка в композиторе будет выглядеть одинаково...
"autoload": {
"psr-0": {"AppName": "src/"}
}
И ваши классы с именами в AppName запустит каталог из текущего рабочего каталога в папке src
сейчас..., который должен работать.