Fatal error: Uncaught Error: Class "App\Services\Mailer" not found
#Как устроена автозагрузка
Composer создаёт файл vendor/autoload.php, который регистрирует автозагрузчик по правилам из composer.json (PSR-4 или classmap). Когда PHP встречает неизвестный класс, он обращается к автозагрузчику, а тот ищет файл по пространству имён. Ошибка Class not found возникает, если: vendor/autoload.php не подключён, пакет не установлен, пространство имён не совпадает с путём к файлу, регистр букв не совпадает (на Linux файловая система чувствительна к регистру), classmap устарел или папка vendor не загружена на сервер.
#Типичные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Не подключён autoload.phpЗабыли require. | Любой класс не найден. | Подключите в точке входа. |
| Нет каталога vendorНе загружен на хостинг. | Файл autoload.php не найден. | composer install. |
| Неверный регистрWindows прощает, Linux нет. | Работает локально, на сервере нет. | Исправьте имя файла. |
| Несовпадение namespaceОпечатка. | Класс есть, не находится. | Приведите в соответствие с PSR-4. |
| Устаревший classmapДобавили класс. | Новый класс не виден. | dump-autoload. |
| Пакет не поддерживает версию PHPТребования. | Установка завершилась ошибкой. | Обновите PHP или пакет. |
#Порядок
- Убедитесь, что точка входа подключает автозагрузчик: require __DIR__Это действия разработчика сайта. Откройте проект в редакторе, затем файл входа (часто
public/index.phpилиindex.php) и найдите подключение Composervendor/autoload.php. Путь с__DIR__считается относительно текущего PHP-файла, поэтому для файлаpublic/index.phpобычно нуженrequire dirname(__DIR__) . '/vendor/autoload.php';, а не__DIR__ . '/vendor/autoload.php'. Сохраните файл после проверки расположения; не добавляйте повторный require в каждый класс. - Проверьте, что каталог vendor существует на сервереОткройте терминал в корне проекта (VS Code: «Терминал» → «Создать терминал»). Выполните
ls vendor/autoload.php(Linux/macOS) илиTest-Path vendor/autoload.php(PowerShell Windows). Если файла нет, значит зависимости не установлены или деплой исключилvendor. Уточните, является ли проект Composer-проектом: рядом должны бытьcomposer.json, обычноcomposer.lock. Не копируйте чужой каталогvendorиз неизвестного источника. - Выполните composer installВ корне проекта запустите
composer install, если нужен набор зависимостей изcomposer.lock; для рабочего сервера только после проверки запуска и учёта нужных пакетов разработки обычно используютcomposer install --no-dev --optimize-autoloader. Сохранитеcomposer.lockи резервную копию перед изменениями. При ошибке проверьте версию PHP, доступность репозитория, права и конкретный пакет по выводу Composer, не заменяйте всё наcomposer updateавтоматически. - Проверьте правила autoload в composer.jsonВ
composer.jsonоткройте разделautoload→psr-4. Например, запись"App\\": "src/"в JSON означает, что классыApp\Services\Mailerдолжны лежать примерно вsrc/Services/Mailer.php. Проверьте, что правило зарегистрировано именно в основномautoload, а не только вautoload-dev, если сайт работает с--no-dev. После изменения сохраните валидный JSON и проверьте командойcomposer validate. - Выполните composer dump-autoload -oЕсли менялась конфигурация автозагрузки или переносились файлы классов, из корня проекта выполните
composer dump-autoload -o; в консоли должно появиться сообщение о создании файлов автозагрузки. Этот шаг не установит отсутствующий пакет и не исправит опечатку в пространстве имён. Для проверки в терминале PHP можно выполнитьphp -r 'require "vendor/autoload.php"; var_dump(class_exists("App\Services\Mailer"));', заменив класс своим;bool(true)означает, что автозагрузка его нашла. - Сверьте регистр имён файлов и классов и namespaceОткройте файл класса в редакторе и сравните его имя с импортом
useили записьюnew. Для PSR-4 проверьте регистр каждого каталога и файла: Linux различаетMailer.phpиmailer.php. В терминале можно выполнитьfind src -iname '*mailer*'на Linux/macOS; если файла нет в репозитории, проверьтеgit statusиgit ls-files. Переименуйте файл с помощью Git, чтобы изменение регистра попало в историю. - Проверьте, что файл класса содержит именно этот класс без опечатокВ начале файла класса проверьте объявление
namespaceи имяclass/interface/trait. Например,namespace App\Services; class MailerсоответствуетApp\Services\Mailer. Убедитесь, что файл не содержит синтаксической ошибки:php -l src/Services/Mailer.php. Если ошибка сообщает о зависимости этого класса, найдите именно вложенныйClass not foundи исправляйте её отдельно. - Проверьте версию PHP: пакет может требовать более новуюВ терминале нужной среды выполните
php -vиcomposer check-platform-reqs(если Composer доступен). Сравните сrequireиconfig.platformпроекта. На хостинге PHP CLI и PHP-FPM могут использовать разные версии: дополнительно проверьте версию обработчика сайта в панели илиphpinfo()на закрытой тестовой странице (не оставляйте её публичной). Если пакет требует другую версию PHP, выбирайте совместимый официальный выпуск, не отключайте проверку требований. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Если Composer недоступен на хостинге
Установите зависимости локально (composer install --no-dev), загрузите по FTP каталог vendor целиком вместе с composer.json и composer.lock. Версия PHP локально должна совпадать с версией на хостинге: проверьте composer config platform.php 8.1 для имитации целевой версии.