Проблема с автозагрузчиком PSR-4

Мне трудно понять, что я делаю неправильно с автозагрузчиком. Моя структура папок выглядит следующим образом:

| - 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?

ColinMD 24.07.2019 10:52

Где я должен это сделать? Я не помню, чтобы раньше делал это в проектах? Хотя я использовал код-заглушку композитора...

Norgul 24.07.2019 10:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

require __DIR__ . '/vendor/autoload.php';

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

Вы можете прочитать об этом здесь

Это решает эту проблему, но почему мой другой проект знает, как включить его сам по себе? Структура проекта одинакова с точки зрения композитора в том смысле, что src, vendor и composer.json находятся на одном уровне папки.

Norgul 24.07.2019 11:18

Ваш другой проект использует фреймворк или какой-либо загрузочный код? Composer также может использовать сопоставление классов PDR-0, которое представляет собой прямое сопоставление папки с пространством имен, поэтому, возможно, все ваши предыдущие проекты использовали PSR-0. Однако сейчас большинство пакетов используют PSR-4, для которого потребуется файл venodr/autoload.

ColinMD 24.07.2019 11:26

Нет, это чистый проект PSR-4, и только те места, где autoload включается, находятся в анализаторе кода PHP, который сам по себе является зависимостью внутри папки vendor. Для этого конкретного проекта его папки — PSR-0, а моя папка migration — PSR-4, но автозагрузчик композитора не загружает PSR-0 папку migration, поэтому я не думаю, что это должно иметь значение?

Norgul 24.07.2019 11:37

Трудно сказать, не видя больше обоих проектов. Также прошло некоторое время с тех пор, как я углубился в композитор, так как почти все мои проекты теперь создаются с помощью Laravel, который обрабатывает всю автозагрузку. Но из памяти все, что делает автозагрузка, - это создает регистр автозагрузки, который сопоставляет имена каталогов/классов с правильными файлами и включает их по запросу.

ColinMD 24.07.2019 12:19

Итак, если в вашем проекте зарегистрирован spl_autoloader, это может быть одной из причин, по которой он не нужен. Если вы включаете или требуете файлы для своего проекта, это также сводит на нет необходимость в автозагрузчике, как только файл найден php, он знает, куда идти, чтобы получить класс.

ColinMD 24.07.2019 12:20

Другие вопросы по теме