Подтвердить что ты не робот

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

<?php

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

Ответ 2

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

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

Предполагая, что ваш файл src находится на том же уровне, что и каталог "vendor":

  • ЦСИ
    • AppName
  • поставщика
  • 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 сейчас..., который должен работать.