Composer classmap autoload не загружает новые файлы в папку

Следующая проблема: я определил classmap в моем composer.json:

"autoload": {
    "classmap": [
        "app/controllers",
        "app/models",
        "app/helper.php"
    ]   
}

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

Это правильное поведение? Я думал, что автозагрузчик от композитора контролирует папку для новых файлов?

Ответы

Ответ 1

Да, это правильное поведение. Если вы хотите, чтобы новые классы загружались автоматически, вы должны использовать автозагрузку PSR-0 или PSR-4.

Для создания класса необходимо, чтобы Composer знал имя файла, которое содержит определенный класс. Это можно сделать только путем анализа всего исходного кода в каталоге и сканирования классов, интерфейсов и определений признаков.

Обычно это задача CPU и ввода-вывода, поэтому она выполняется только тогда, когда Composer устанавливает/обновляет или (по запросу) выгружает автозагрузчик, это не делается с каждым require "vendor/autoload.php";.

Обратите внимание, что автозагрузка classmap просто существует для старых устаревших кодовых баз, которые не реализовали хотя бы PSR-0. Он не предназначен для нового кода - если вы не хотите заплатить цену, чтобы сбрасывать автозагрузчик снова и снова во время разработки.

Ответ 2

Перейдите в корень вашего сервера с помощью SSH. Теперь сделайте следующее:

  • Запустите ls, чтобы просмотреть все файлы.
  • Вы увидите файл composer.lock; удалите файл командой rm composer.lock.
  • Теперь запустите команду php composer update.

В зависимости от типа вашего linux вам может потребоваться запустить php-cli composer update.

Шаг 3 создаст новый файл composer.lock, и все ваши классы будут загружены снова. Выполняйте это при каждом добавлении новых классов.

или

  • Запустите команду composer dump-autoload.

Ответ 3

Как уже указывалось, это правильное поведение. Если вы хотите, чтобы новые классы загружались автоматически, вы должны использовать автозагрузку PSR-0 или PSR-4.

Указанный тип автозагрузки карты классов - это composer.json, который в основном используется устаревшими проектами, которые не следуют PSR-0 или PSR-4. Недавно я начал работать над таким проектом и хотел попытаться автоматически запустить команду composer dump-autoload при создании нового класса. Это на самом деле сложно, не включая весь источник композитора в проект. Я придумал это, чтобы напомнить разработчику, что им нужно сбросить карту классов:

$loader = include_once 'vendor/autoload.php';
if ( ! $loader ) {
    throw new Exception( 'vendor/autoload.php missing please run 'composer install'' );
}

spl_autoload_register(
    function ( $class ) {
        if ( 'A_Common_Class_Prefix' === substr( $class, 0, 10 ) ) {
            throw new Error( 'Class "' . $class . '"" not found please run 'composer dump-autoload'' );
        }
    },
    true
);

Это регистрирует другой автозагрузчик, который запускается после автозагрузчика композитора, поэтому любые классы, которые композитор не нашел, будут переданы ему. Если класс соответствует префиксу, возникает исключение throw, напоминающее разработчику повторно выгрузить автозагрузчик и обновить карту классов.

Ответ 4

Для меня это почему-то не сработало с картой классов Yii 1, когда я добавил - требовал ее вместе со многими другими присутствующими библиотеками - я точно не помню, возможно, я вручную отредактировал файл или права доступа к файлам были виноваты, это было по какой-то причине не обновлялся, даже когда я удалил composer.lock и полностью удалил папку vendor - возможно, какой-то кэш, насколько я помню, но фактически мне помогло то, что сначала была установлена только одна эта библиотека, она генерировала карту классов Затем я добавил все остальные оставшиеся библиотеки отдельно на втором этапе, альт, все загружаемое.