Мне трудно понять, что я делаю неправильно с автозагрузчиком. Моя структура папок выглядит следующим образом:
| - src/
| - Files/
| - Bla.php
| - Models/
| - ...
| - vendor/
| - ...
| composer.json
А часть автозагрузки composer.json выглядит так:
"autoload": {
"psr-4": {
"Migrations\\" : "src/"
}
}
Теперь Bla.php выглядит так:
<?php
namespace Migrations\Files;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Bla extends AbstractMigration
{
...
}
И я получаю сообщение об ошибке:
Fatal error: Class 'Doctrine\Migrations\AbstractMigration' not found in /var/www/html/migrations/src/Files/Bla.php
Когда я смотрю на папку vendor, пакет там. В моей среде IDE также отлично работает индексация, поэтому я без проблем могу нажать CMD+клик на файл AbstractMigration.
Я пытался удалить папку vendor, очистить кеш композитора, выполнить дамп-автозагрузку и переустановить все пакеты, но, похоже, ничего не работает.
Где я делаю ошибку?
Где я должен это сделать? Я не помню, чтобы раньше делал это в проектах? Хотя я использовал код-заглушку композитора...






Вам необходимо включить файл автозагрузки Composer, иначе ваше приложение не будет знать, какие классы существуют. Это файл, созданный композитором при установке зависимостей, многие фреймворки, использующие Composer, автоматически включат этот файл, но если вы не используете фреймворк, вам нужно будет включить этот файл самостоятельно.
require __DIR__ . '/vendor/autoload.php';
Где вам нужно его поместить, зависит от вашего приложения, но лучше загрузить его как можно раньше, если у вас есть файл начальной загрузки, тогда это будет место для его размещения.
Вы можете прочитать об этом здесь
Это решает эту проблему, но почему мой другой проект знает, как включить его сам по себе? Структура проекта одинакова с точки зрения композитора в том смысле, что src, vendor и composer.json находятся на одном уровне папки.
Ваш другой проект использует фреймворк или какой-либо загрузочный код? Composer также может использовать сопоставление классов PDR-0, которое представляет собой прямое сопоставление папки с пространством имен, поэтому, возможно, все ваши предыдущие проекты использовали PSR-0. Однако сейчас большинство пакетов используют PSR-4, для которого потребуется файл venodr/autoload.
Нет, это чистый проект PSR-4, и только те места, где autoload включается, находятся в анализаторе кода PHP, который сам по себе является зависимостью внутри папки vendor. Для этого конкретного проекта его папки — PSR-0, а моя папка migration — PSR-4, но автозагрузчик композитора не загружает PSR-0 папку migration, поэтому я не думаю, что это должно иметь значение?
Трудно сказать, не видя больше обоих проектов. Также прошло некоторое время с тех пор, как я углубился в композитор, так как почти все мои проекты теперь создаются с помощью Laravel, который обрабатывает всю автозагрузку. Но из памяти все, что делает автозагрузка, - это создает регистр автозагрузки, который сопоставляет имена каталогов/классов с правильными файлами и включает их по запросу.
Итак, если в вашем проекте зарегистрирован spl_autoloader, это может быть одной из причин, по которой он не нужен. Если вы включаете или требуете файлы для своего проекта, это также сводит на нет необходимость в автозагрузчике, как только файл найден php, он знает, куда идти, чтобы получить класс.
Вы используете Composer и включаете файл автозагрузки Composer?