Я смотрю вокруг сети, не повезло по этому вопросу. Я использую автозагрузку композитора с этим кодом в моем composer.json
:
"autoload": { "psr-0": {"AppName": "src/"} }
Но мне нужно автозагрузку на более высоком уровне, чем папка поставщика.
Выполнение чего-то подобного не работает:
"autoload": { "psr-0": {"AppName": "../src/"} }
Кто-нибудь знает какое-либо решение или как я могу это сделать?
Каждый пакет должен отвечать за самозагрузку, чего вы пытаетесь достичь с помощью автозагрузки классов, которые не входят в пакет, который вы определяете?
Один обходной путь, если это для вашего приложения, – это добавить пространство имен в экземпляр загрузчика, что-то вроде этого:
<?php $loader = require 'vendor/autoload.php'; $loader->add('AppName', __DIR__.'/../src/');
Документация композитора гласит, что:
После добавления поля автозагрузки вам необходимо повторно запустить установку, чтобы повторно создать файл vendor / autoload.php.
Предполагая, что ваш «src» dir находится на том же уровне, что и «vendor»:
следующая конфигурация абсолютно правильная:
{ "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
сейчас …, который должен работать.